Leetcode Basic Calculator I,II,III
227. Basic Calculator II
解析:
先从II开始讲起因为这个不包括有括号的情况,作为I和III的基础
这个是必须掌握的题目。总体思路是,利用栈保存临时运算的结果,高优先级的先运算,最后直接对栈一次性求和。具体策略是:
- 利用栈来临时储存之前的运算结果,利用pre_op来保存之前最近一个的操作符,利用num保存当前数字
- 首先初始化stack为空,pre_op为+,num为0
- 如果当前碰到的是数字,要跟之前保存的数字进行累加,这是为了应对多位数的出现
- 如果当前碰到的是操作符或者是到了最后一个位置,那么对pre_op进行分类讨论,因为在处理当前的操作符时,须先处理前一个操作符的结果
- 如果pre_op加号,直接将当前累计数字压栈
- 如果是减号,那么将相反数压栈,以便后面一次性求和
- 如果碰到乘除,应当将栈顶元素出栈,与我们临时保存的num进行运算,并将结果压栈
- 如果当前碰到的是操作符,需更新pre_op和当前nums
- 最后将栈内所有临时结果求和
python:
python版本的除法有一点需要注意,python内负数的整除法会默认向下取整,比如-3/2结果会是-2而不是我们想要的-1,所以需要对除法分情况讨论
class Solution:
def calculate(self, s: str) -> int:
stack = []
pre_op = '+'
num = 0
s = s+'+'
for v in s:
if v.isdigit():
num = num*10+int(v)
if v in '+-*/':
if pre_op == '+':
stack.append(num)
if pre_op=='-':
stack.append(-num)
if pre_op == '*':
stack[-1] *= num
if pre_op == '/':
top = stack.pop()
if top<0:
stack.append(int(top/num))
else:
stack.append(top//num)
pre_op = v
num = 0
return sum(stack)
C++
class Solution {
public:
int calculate(string s) {
stack<int> nums;
char pre_op = '+';
int num = 0;
for (int i=0;i<s.length();i++){
if (isdigit(s[i])){
num = 10*num + (s[i]-'0');
}
if (i==s.size()-1 || s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/'){
if (pre_op=='+')