#include using namespace std; string s; //栈:数字 stack f; //栈:操作符 stack symbol; //操作符之间的优先级的比较 char cmp(char a, char b) { //右括号不会进栈,不必写右括号的优先级 //遇到右括号就弹出左括号 if (a == '#') { if (b == '#') { return '='; } else { return '<'; } } if (a == '+' || a == '-') { if (b == '*' || b == '/' || b == '(') { return '<'; } else { return '>'; } } if (a == '*' || a == '/') { if (b == '(') { return '<'; } else { return '>'; } } if (a == '(') { if (b == ')') { return '='; } else { return '<'; } } } //返回计算结果 int cal(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; } } //表达式计算的过程 int process() { int i = 0, num = 0; while (symbol.top() != '#' || i < s.size()) { if (s[i] >= '0' && s[i] <= '9') { //为操作数 num = 0; while (s[i] >= '0' && s[i] <= '9') { num *= 10; num += s[i] - '0'; ++i; } f.push(num); } else { switch (cmp(symbol.top(), s[i])) { case '<': symbol.push(s[i]); ++i; break; case '=': symbol.pop(); ++i; break; case '>': int a = f.top(); f.pop(); int b = f.top(); f.pop(); f.push(cal(b, a, symbol.top())); symbol.pop(); break; } } } int res = f.top(); f.pop(); return res; } int main() { symbol.push('#'); //测试用例: 2*(2+3)-4 s = "2*(2+3)-4"; cout << s << "=" << process() << endl; return 0; }