1 条题解
-
1
核心就是遵循优先级去计算,先算乘除后算加减,不过本题还加了个括号,代码只是做了模拟。(暂时认为没什么好讲的,代码部分只是模拟)
#include<iostream> #include<stack> #include<unordered_map> using namespace std; unordered_map<char, int> p = { {'+',1},{'-',1},{'*',2},{'/',2} };//存储运算符的优先级,非常利于扩展 stack<char> op;//存操作符 stack<int> num;//存数字 void eval()//一次计算 { int b = num.top();//第二个操作数 num.pop(); int a = num.top();//第一个操作数 num.pop(); char c = op.top();//操作符 op.pop(); int sum = 0; if (c == '+') sum = a + b;//计算 if (c == '-') sum = a - b; if (c == '*') sum = a * b; if (c == '/') sum = a / b; num.push(sum);//新数字 } int main() { string s; cin >> s; for (int i = 0; i < s.size(); ++i) { if (isdigit(s[i]))//读取数字 { int t = 0; while (isdigit(s[i]) && i < s.size()) t = t * 10 + (s[i++] - '0'); i--;//外面的for还会加所以减一次 num.push(t); } else if (s[i] == '(') op.push('('); else if (s[i] == ')') { while (op.top() != '(') eval();//将括号内全部算完 op.pop(); } else { while (op.size() && p[op.top()] >= p[s[i]]) eval();//新入栈操作符优先级小,直接计算 op.push(s[i]);//入栈新操作符 } } while (op.size()) eval();//最后计算剩余 cout << num.top() << endl; return 0; }
- 1
信息
- ID
- 73
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者