题目描述
给定一个表达式,其中运算符仅包含 + , - , * , /(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。
输入格式
共一行,为给定表达式。
输出格式
共一行,为表达式的结果。
数据范围
表达式的长度不超过 105。
输入样例
(2+2)*(1+1)
输出样例
8
代码实现
#include<bits/stdc++.h>
using namespace std;
stack<int> num;
stack<char> op;
void eval(){
int b = num.top(); num.pop();
int a = num.top(); num.pop();
char p = op.top(); op.pop();
if(p == '+') num.push(a+b);
else if(p == '-') num.push(a-b);
else if(p == '*') num.push(a*b);
else num.push(a/b);
}
int main(){
unordered_map<char,int> s = {{'+',1},{'-',1},{'*',2},{'/',2}}; ///设置运算符优先级
string str;
cin>>str;
for(int i = 0; i < str.size(); i ++){
char c = str[i];
if(isdigit(c)){
int j = i,x = 0;
while(j < str.size() && isdigit(str[j])){ ///将数字读入完整
x = x * 10 + str[j++] - '0'; ///将 “字符数字” 转换为 数字
}
num.push(x);
i = j - 1; ///将i指向最后一个数字
}else if(c == '('){
op.push(c);
}else if(c == ')'){ ///碰到右括号将右括号里面的式子计算出来
while(op.size()&&op.top()!='(') eval();
op.pop();
}else{
while(op.size() && s[op.top()] >= s[c]) eval(); ///将运算符栈清空
op.push(c);
}
}
while(op.size()) eval();
cout<< num.top()<<endl;
return 0;
}