递归题目,求表达式的值
求当前字符串s表达式的值,实现需要用栈依次存储数字:
如果当前state是‘+',求push(num)
如果是'-', 就push(-num)
如果是'*',就将栈顶的元素乘以num即可
一开始的时候state定义为'+',相当于0 +
处理数字值:
if('0' <= s[i] && s[i] <= '9'){
sum = sum * 10 + (s[i] - '0');
}
这部分代码表示的是求整个括号的值,因为()的优先级最高,所以遇到括号直接处理:
[left, right]区间表示的是括号内的内容; 不包含括号,如果包含括号就死循环了,然后sum = solve(.....)递归处理出括号里面的值
if(s[i] == '('){
int count = 1;
int left = ++ i;
while(count > 0){
if(s[i] == '(') count ++;
if(s[i] == ')') count --;
i ++;
}
i --;
int right = i - 1;
sum = solve(s.substr(left, right - left + 1));
}
当s[i]为运算符号时,就得将当前的sum加入栈中, 是正是负或是乘取决于现在的state而不是s[i], s[i]表示的是下一个num的符号
或者是最后一个字符时,当到达最后一个字符(最后一个字符一定是数字,如果是括号那早就处理掉了),所以也得放入栈中
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || i == (int)s.size() - 1){
if(state == '+') sta.push(num);
else if(state == '-') sta.push(-num);
else sta.top() *= num;
state = s[i];
num = 0;
}
,最后累加栈里面的值并返回
int res = 0;
while(sta.size()){
res += sta.top();
sta.pop();
}
总代码:
class Solution {
public:
int solve(string s) {
int sum = 0;
char state = '+';
stack<int> sta;
for(int i = 0; i < (int)s.size(); i ++){
if('0' <= s[i] && s[i] <= '9'){
sum = sum * 10 + (s[i] - '0');
}
if(s[i] == '('){
int count = 1;
int left = ++ i;
while(count > 0){
if(s[i] == '(') count ++;
if(s[i] == ')') count --;
i ++;
}
i --;
int right = i - 1;
sum = solve(s.substr(left, right - left + 1));
}
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || i == (int)s.size() - 1){
if(state == '+') sta.push(num);
else if(state == '-') sta.push(-num);
else sta.top() *= num;
state = s[i];
num = 0;
}
}
int res = 0;
while(sta.size()){
res += sta.top();
sta.pop();
}
return res;
}
};



京公网安备 11010502036488号