
思路


            
            
              python
              
              
            
          
          class Solution:
    def calculate(self, s):
        stack = []
        pre_op = '+'
        num = 0
        for i, each in enumerate(s):
            if each.isdigit():
                num = 10 * num + int(each)
            if i == len(s) - 1 or each in '+-*/':
                if pre_op == '+':
                    stack.append(num)
                elif pre_op == '-':
                    stack.append(-num)
                elif pre_op == '*':
                    stack.append(stack.pop() * num)
                elif pre_op == '/':
                    top = stack.pop()
                    if top < 0:
                        stack.append(int(top / num))
                    else:
                        stack.append(top // num)
                pre_op = each
                num = 0
        return sum(stack)
作者:负雪明烛
链接:https://leetcode.cn/problems/basic-calculator-ii/solutions/648941/xian-cheng-chu-zai-jia-jian-yong-zhan-ba-hplr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
        这段代码定义了一个名为 Solution 的类,并实现了一个方法 calculate,用于计算给定数学表达式的值。以下是具体解释:
- 
类与方法定义:
class Solution::定义一个名为Solution的类。def calculate(self, s)::定义一个方法calculate,接收一个字符串s,表示数学表达式。
 - 
初始化:
stack = []:创建一个空列表stack,用于存储计算结果。pre_op = '+':初始化一个变量pre_op,用于记录上一个操作符,默认为加号。num = 0:用于存储当前正在处理的数字。
 - 
遍历字符串:
for i, each in enumerate(s)::遍历字符串s的每个字符。if each.isdigit()::检查当前字符是否为数字。num = 10 * num + int(each):构建当前数字(考虑多位数情况)。
 - 
操作符处理:
if i == len(s) - 1 or each in '+-*/'::判断是否到达字符串末尾或当前字符是一个操作符。- 根据 
pre_op的值决定如何处理num:- 如果是加号 
+,将num添加到stack。 - 如果是减号 
-,将-num添加到stack。 - 如果是乘号 
*,将栈顶元素与num相乘,再存回栈中。 - 如果是除号 
/,则处理除法(考虑整数除法的情况,负数处理特别)。 
 - 如果是加号 
 - 更新 
pre_op为当前操作符,重置num为 0。 
- 根据 
 
 - 
返回结果:
return sum(stack):计算栈中所有元素的和并返回,得到最终结果。
 
总结:这段代码通过栈实现了对基本四则运算的支持,能够处理带有不同操作符的数学表达式,并正确计算结果。
下面以 3-5/2为例解释具体执行流程
让我们详细分析如何通过 calculate 方法计算表达式 "3-5/2" 的执行流程。
输入
            
            
              python
              
              
            
          
          s = "3-5/2"
        执行流程
- 
初始化
stack = []: 初始化堆栈为空。pre_op = '+': 上一个操作符设为加号。num = 0: 当前数字初始化为0。
 - 
遍历字符串
- 对每个字符进行遍历。
 
 
第一次循环 (i = 0, each = '3')
'3'是数字:num = 10 * 0 + 3→num = 3
第二次循环 (i = 1, each = '-')
i不是字符串的最后一个字符且'-'是操作符:- 因为 
pre_op == '+':stack.append(3)→stack = [3]
 - 更新 
pre_op = '-' - 重置 
num = 0 
- 因为 
 
第三次循环 (i = 2, each = '5')
'5'是数字:num = 10 * 0 + 5→num = 5
第四次循环 (i = 3, each = '/')
i不是字符串的最后一个字符且'/'是操作符:- 因为 
pre_op == '-':stack.append(-5)→stack = [3, -5]
 - 更新 
pre_op = '/' - 重置 
num = 0 
- 因为 
 
第五次循环 (i = 4, each = '2')
'2'是数字:num = 10 * 0 + 2→num = 2
第六次循环 (i = 5, each 是结束位置)
- 由于到达字符串末尾:
- 当前 
pre_op为'/':- 执行除法,将栈顶元素与 
num相除: top = stack.pop()→top = -5(从栈中移除-5)- 因为 
top < 0:stack.append(int(top / num))→stack.append(int(-5 / 2))→stack.append(-2)(结果为-2.5,取整为-2)stack现在为[3, -2]
 
 - 执行除法,将栈顶元素与 
 
 - 当前 
 
结果计算
return sum(stack):- 计算 
3 + (-2) = 1 
- 计算 
 
最终结果
因此,表达式 "3-5/2" 的计算结果是 1。