赞
踩
实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。
class Solution { public: int calculate(string s) { stack<int> ops; ops.push(1); int sign = 1; int ret = 0; int n = s.length(); int i = 0; while (i < n) { if (s[i] == ' ') { i++; } else if (s[i] == '+') { sign = ops.top(); i++; } else if (s[i] == '-') { sign = -ops.top(); i++; } else if (s[i] == '(') { ops.push(sign); i++; } else if (s[i] == ')') { ops.pop(); i++; } else { long num = 0; while (s[i] >= '0' && s[i] <= '9') { num = num * 10 + s[i] - '0'; i++; } ret += sign * num; } } return ret; } };
因为有括号所以导致运算时有先后顺序,此时需要保存之前的运算结果再运算后面的,所以需要用到栈结构
该方法将栈顶存的是运算符,在 pop 的时候弹出的是需要先算的,也就是括号里面的.用到了递归的思想
while (s[i] >= '0' && s[i] <= '9') {
num = num * 10 + s[i] - '0';
i++;
}
这段代码是为了运算多位数时循环逐位读取,好比将字符 ‘290’转成数字290,先解析2,再解析9时,将210+9=29;再解析0时,将2910+0=290;这样,就完成了字符’290‘到数字290的转变.
- '0'
是因为该题目是字符串形式的,在字符串与整形运算时是用ASCII 码的数值运算的,所以要减掉’0’代表的 ASCII 码 48 才是真正的整型数字
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。