题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
#include <cctype>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
unordered_map<char,int> map;
void calu(stack<int>&nums,stack<char> &ops){
int a=nums.top();nums.pop();
int b=nums.top();nums.pop();
char op=ops.top();ops.pop();
if(op=='+')
nums.push(a+b);
else if(op=='-')
nums.push(b-a);
else
nums.push(b*a);
}
void replace(string &s){
int pos=s.find(" ");
while(pos!=-1){
s.replace(pos,1,"");
pos=s.find(" ");
}
}
int solve(string s) {
// write code here
map['+']=1;
map['-']=1;
map['*']=2;
replace(s);
int n=s.size();
stack<int> nums;
stack<char> ops;
nums.push(0);
for(int i=0;i<n;i++){
char c=s[i];
if(c=='('){
ops.push(c);
}
else if(c==')'){
while(!ops.empty()&&ops.top()!='('){
calu(nums,ops);
}
if(!ops.empty())
ops.pop();
}
else if(isdigit(c)){
int sum=0;
while(i<n&&isdigit(s[i])){
sum=sum*10+(s[i]-'0');
i++;
}
i--;
nums.push(sum);
}
else{
if(i>0&&s[i-1]=='(')
nums.push(0);
while(!ops.empty()&&ops.top()!='('&&(map[c]<=map[ops.top()])){
calu(nums,ops);
}
ops.push(c);
}
}
while(!ops.empty()){
calu(nums,ops);
}
return nums.top();
}
};