算法题49: 表达式求值
思路
- 遍历字符串;
- 若遇到数字,将数值字符串转换为整型数值;
- 若遇到左括号,找到对应的右括号,将括号内容进行迭代计算数值;
- 若遇到运算符或字符串遍历结束,则开始计算数据,判断上一个运算符,对数据进行对应的处理,将运算结果都转化为加法保存在栈中,并更新运算符标志;
- 遍历相加栈中数值,得到计算结果。
代码
int solve(string s) {
stack<int> st_num;
int num = 0;
char sign = '+';
int res = 0;
for(int i = 0; i <= s.size(); i++){
if(s[i] == '('){
int count = 1;
int left = i + 1;
while(count > 0){
i++;
if(s[i] == '(') count++;
if(s[i] == ')') count--;
}
num = solve(s.substr(left, i - left));
}
else if(s[i] >= '0' && s[i] <= '9'){
while(s[i] >= '0' && s[i] <= '9'){
num *= 10;
num += s[i] - '0';
i++;
}
i--;
}
else if(i == s.size() || s[i] == '+' || s[i] == '-' || s[i] == '*'){
if(sign == '+') st_num.push(num);
else if(sign == '-') st_num.push(-num);
else if(sign == '*') st_num.top() *= num;
sign = s[i];
num = 0;
}
}
while(!st_num.empty()){
res += st_num.top();
st_num.pop();
}
return res;
}