题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
#include<regex>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
// set operator priority
map<char,int> mymap;
int solve(string s) {
// write code here
mymap['-'] = 1;
mymap['+'] = 1;
mymap['*'] = 2;
mymap['/'] = 2;
mymap['%'] = 2;
mymap['^'] = 3;
std::regex r("\\s+");
s = std::regex_replace(s,r,"");
deque<int> nums;
nums.push_back(0);
deque<char> ops;
for (int i=0;i<s.size();i++){
char c = s[i];
if (c=='('){
ops.push_back(c);
}else if (c==')'){
while(!ops.empty()){
if (ops.back()!='('){
calculate(nums,ops);
}else{
ops.pop_back();
break;
}
}
}else {
// number
if (c>'0'&&c<'9'){
int val = 0;
int j = i;
while(j<s.size()&&(s[j]>='0'&&s[j]<'9')) val = val * 10 + (s[j++] - '0');
nums.push_back(val);
i = j - 1;
}else{
// operator
// handle signed number
if (i>0&&(s[i-1]=='+'||s[i-1]=='-')) nums.push_back(0);
while (!ops.empty()&&ops.back()!='('){
char prev = ops.back();
if (mymap[prev]>=mymap[c]){
calculate(nums,ops);
}else{
break;
}
}
ops.push_back(c);
}
}
}
while(!ops.empty()&&ops.back()!='(') {
calculate(nums,ops);
}
return nums.back();
}
void calculate(deque<int>& nums, deque<char>& ops){
if (nums.empty()|| nums.size()<2) return;
if (ops.empty()) return;
int b = nums.back();
nums.pop_back();
int a = nums.back();
nums.pop_back();
char op = ops.back();
ops.pop_back();
int ans = 0;
if (op=='-') ans = a - b;
else if (op=='+') ans = a + b;
else if (op=='*') ans = a * b;
else if (op=='/') ans = a / b;
else if (op=='%') ans = a % b;
else if (op=='^') ans = pow(a,b);
nums.push_back(ans);
}
};


查看17道真题和解析