問題描述
輸入一個只包含加減乖除和括號的合法表達式,求表達式的值。其中除表示整除。
輸入格式
輸入一行,包含一個表達式。
輸出格式
輸出這個表達式的值。
樣例輸入
1-2+3*(4-5)
樣例輸出
-4
數據規模和約定
表達式長度不超過100,表達式運算合法且運算過程都在int內進行。
主要思路:中綴表達式改爲後綴表達式並計算,後綴表達式又叫逆波蘭式,百度百科中介紹的很清楚(逆波蘭式),主要利用棧後進先出的特點來解決問題,通過兩個棧的相互關係來解決問題。
代碼:
#include <iostream>
#include <string>
#include <stack>
using namespace std;
char rel[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='}
};
char change(char a,char b);
int operate(int m,int n,char x);
int main()
{
stack<char> RPNc;
stack<int > RPNi;
string str;
cin >> str;
str += "######";
RPNc.push('#');
char c = str[0];
int i = 1;
while(c != '#' || RPNc.top() != '#')
{
if(c >= '0' && c <= '9' )
{
int sum = 0;
while(c >= '0' && c <= '9')
{
sum = sum*10 + (c - '0');
c = str[i++];
}
RPNi.push(sum);
}
else
{
switch(change(RPNc.top(),c))
{
case'<':RPNc.push(c);c=str[i++];break;
case'=':RPNc.pop();c=str[i++];break;
case'>':
char x=RPNc.top();
RPNc.pop();
int m=RPNi.top();
RPNi.pop();
int n=RPNi.top();
RPNi.pop();
RPNi.push(operate(m,n,x));
break;
default:break;
}
}
}
cout << RPNi.top() <<endl;
return 0;
}
char change(char a,char b)
{
int i,j;
switch(a)
{
case'+':i=0;break;
case'-':i=1;break;
case'*':i=2;break;
case'/':i=3;break;
case'(':i=4;break;
case')':i=5;break;
case'#':i=6;break;
default:break;
}
switch(b)
{
case'+':j=0;break;
case'-':j=1;break;
case'*':j=2;break;
case'/':j=3;break;
case'(':j=4;break;
case')':j=5;break;
case'#':j=6;break;
default:break;
}
return rel[i][j];
}
int operate(int m,int n,char x)
{
switch(x){
case'+':return m+n;
case'-':return n-m;
case'*':return m*n;
case'/':return n/m;
default:return -1;
}
}
主要問題:
stack<char> RPNc;//儲存字符串的棧 RPN_char
stack<int > RPNi;//儲存數字的棧 RPN_int
string str;//輸入字符串
1.如何輸入數據?
採用的是string,也可以使用char數組
2.如何轉換字符串中的數字?
if(c >= '0' && c <= '9' )//判斷是否是數字
{
int sum = 0;
while(c >= '0' && c <= '9')
{
sum = sum*10 + (c - '0');
c = str[i++];
}//將相連的數字字符轉化爲數字
RPNi.push(sum);
}
3.如何判斷運算符優先級?
設X1爲RPNc棧頂元素,X2爲字符串中待輸入的運算符
x1與x2關係表:
|x2\x1|+|-||/|(|)|#|
|—|:|:–|:–|:–|:–|:–|
|+|>|>|<|<|<|>|>|
|-|>|>|<|<|<|>|>|
||>|>|>|>|<|>|>|
|/|>|>|>|>|<|>|>|
|(|<|<|<|<|<|=|0|
|)|>|>|>|>|0|>|>|
|#|<|<|<|<|<|0|=|
//可以寫成一個字符數組表示關係relation
char rel[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='}};
在將字符串中的運算符壓入棧過程中通過change函數和rel數組進行判斷