分析
将中缀表达式变为后缀表达式
设置两个栈,一个数字栈,一个运算符栈,每次将数字栈的两个数拿出来,一个运算符栈的符号拿出来,进行计算,然后把运算结果再次送入数字栈中,一直循环到栈空为止。
注意:当有乘号和除号时,应尽快计算,所以设置一个哈希表用来存储$ +- 和 */$的优先级。
C++ 代码
class Solution {
public:
bool digit(char p)
{
if(p>='0' && p<='9') return true;
return false;
}
unordered_map<char,int> pri;
stack<int> stk;
stack<char> op;
void eval() //运算过程
{
int a=stk.top(); stk.pop(); //取出数字栈顶两个元素
int b=stk.top(); stk.pop();
char c=op.top(); op.pop(); //取出操作符栈顶一个元素
//判断运算符,注意b比a靠前进到栈里,所以应该是b 操作 a
if(c=='+') b=b+a;
if(c=='-') b=b-a;
if(c=='*') b=b*a;
if(c=='/') b=b/a;
stk.push(b); //运算后的结果要加入到栈中
}
int calculate(string s) {
pri['+']=pri['-']=1; //+ - 的优先级为1
pri['*']=pri['/']=2; //* / 的优先级为2
for(int i=0;i<s.size();i++)
{
if(s[i]==' ') continue;
else if(digit(s[i])){ //当s[i]为数字时,计算该数字的大小
int num=0,j=i;
while(j<s.size() && digit(s[j]))
{
num=num*10+(s[j]-'0');
j++;
}
stk.push(num); //计算完成后将数字num入数字栈
i=j-1; //如果i=j的话下次循环开始时i要++,会跳过一个字符,所以i=j-1,防止跳过字符
}
else{
while(op.size() && pri[op.top()]>=pri[s[i]]) eval(); //当前栈顶运算符优先级大于等于即将入栈的字符,就先进行运算
op.push(s[i]);
}
}
while(op.size()) //将符号栈剩余的运算符进行运算
{
eval();
}
return stk.top(); //最后数字栈栈顶就是最终的结果
}
};