AcWing 3302. 表达式求值
原题链接
中等
作者:
Krona
,
2024-10-13 15:58:44
,
所有人可见
,
阅读 8
#include<bits/stdc++.h>
using namespace std;
stack<int>nums;
stack<char>ops;
unordered_map<char,int>h={{'+',1},{'-',1},{'*',2},{'/',2}};
void cal(){
int b=nums.top();
nums.pop();
int a=nums.top();
nums.pop();
char op=ops.top();
ops.pop();
int res=0;
if(op=='+')res=a+b;
if(op=='-')res=a-b;
if(op=='*')res=a*b;
if(op=='/')res=a/b;
nums.push(res);
// cout<<"计算"<<res<<endl;
}
int main(){
string s;cin>>s;
int n=s.size();
for(int i=0;i<n;i++){
if(isdigit(s[i])){
int res=0;
while(i<n and isdigit(s[i])){
res=res*10+s[i]-'0';
i++;
}
//cout<<res<<endl;
i--;
nums.push(res);
}
else if(s[i]=='(')ops.push(s[i]);
else if(s[i]==')'){
while(ops.top()!='(')cal();
ops.pop();
}
else{
while(ops.size() and h[ops.top()]>=h[s[i]])cal();
ops.push(s[i]);
}
}
while(ops.size())cal();
cout<<nums.top()<<endl;
}