主页 > 电脑硬件  > 

【算法】3302.表达式求值

【算法】3302.表达式求值
题目

3302. 表达式求值

思路

把数字压入栈后 i = j - 1是因为while最后还有个i++,所以先减去1,才能抵消,下一次才能读下一个字符或数。

代码 #include <iostream> #include <stack> #include <string> #include <unordered_map> using namespace std; stack<int> num; stack<char> op; unordered_map<char, int> h{ {'+', 1}, {'-', 1}, {'*',2}, {'/', 2} }; void eval()//求值 { int a = num.top();//第二个操作数 num.pop(); int b = num.top();//第一个操作数 num.pop(); char p = op.top();//运算符 op.pop(); int r = 0; //计算结果 if (p == '+') r = b + a; if (p == '-') r = b - a; if (p == '*') r = b * a; if (p == '/') r = b / a; num.push(r);//结果入栈 } int main() { string s;//读入表达式 cin >> s; for (int i = 0; i < s.size(); i++) { if (isdigit(s[i]))//数字入栈 { int x = 0, j = i; while (j < s.size() && isdigit(s[j])) { x = x * 10 + s[j] - '0'; j++; } num.push(x); i = j - 1; } else if (s[i] == '(') { op.push(s[i]); } else if (s[i] == ')')//右括号 { while(op.top() != '(') eval(); op.pop();//左括号出栈 } else { while (op.size() && h[op.top()] >= h[s[i]]) eval(); op.push(s[i]); } } while (op.size()) eval(); cout << num.top() << endl; return 0; }
标签:

【算法】3302.表达式求值由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【算法】3302.表达式求值