源码里面有注释,就不详细讲了:
#include<bits/stdc++.h>
using namespace std;
char pd(char op1,char op2){ //判断优先级
string yxjb="++> +-> +*< +/< +(< +)> +#> +[< +]> -+> --> -*< -/< -(< -)> -#> -[< -]> *+> *-> **> */> *(< *)> *#> *[< *]> /+> /-> /*> //> /(< /)> /#> /[< /]> (+< (-< (*< (/< ((x ()= (#x ([x (]x )+> )-> )*> )/> )(x ))x )#> )[> )]> #+< #-< #*< #/< #(< #)x ##= #[< #]x [+< [-< [*< [/< [(< [)x [#x [[< []= ]+> ]-> ]*> ]/> ](< ])> ][> ]]> ]#>";
for(int i=1; i<=81; i++)
if(yxjb[i*4-4] == op1 && yxjb[i*4-3] == op2)
return yxjb[i*4-2];
return 'x';
}
int main() {
stack<int> num;
stack<char> op;
int i=0;
string s;
cin >> s;
op.push('#');
while(!(i >= s.size() && op.top() == '#')){
if(s[i] >= 48 && s[i] <= 57){
int n=s[i]-48;
i++;
while(s[i] >= 48 && s[i] <= 57){ //数字可能有好几位,需要一个循环
n=n*10+(s[i]-48);
i++;
}
num.push(n);
}else{
char yxj = pd(op.top(),s[i]);
if(yxj == '<'){ //如果优先级比这个低,不能直接算,先放入栈
op.push(s[i]);
i++;
}else if(yxj == '='){ //括号匹配
op.pop();
i++;
}else{ //如果优先级比这个高,直接计算掉
int _a=num.top();
num.pop();
int _b=num.top();
num.pop();
int _op=op.top();
op.pop();
/*
这里只写了加、减、乘、除,其实,可以增加更多的运算符
比如:
if(_op == '^')
num.push(pow(_a,_b));
*/
if(_op == '+')
num.push(_a+_b);
if(_op == '-')
num.push(_a-_b);
if(_op == '*')
num.push(_a*_b);
if(_op == '/')
num.push(_a/_b);
}
}
}
cout << num.top();
num.pop();
return 0;
}