品牌推广部的职责广州seo排名外包
题目
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;
}