一、单栈
思路
代码实现
二、双栈
单双栈异同点
思路
特殊情况
★模拟图解
代码实现
说明
==
应对不同情况下的字符串表达式求值,本篇提供双栈和单栈两种解法。当表达式较为简单不存在括号时,可使用单栈求解,其他情况使用双栈。
算法
==
一、单栈
当表达式不存在括号时,如"3+2*5-4/2"可使用单栈求解。
思路
我们遍历表达式,每遇到一个运算符就对运算符前面的数字进行相应操作。
定义了一个栈,将消除乘除号后的数字添进栈中,最后使用sum方法将栈内元素求和得出最终结果。
-
当遇到"+"号时,将符号前面的数字(称为num)压入栈中
-
当遇到"-"号时,将(-num)压入栈中
-
当遇到"*“号时,将栈顶元素与”*"号后面的数字相乘得出的结果赋值给栈顶元素
-
当遇到"/“号时,将栈顶元素与”/"号后面的数字相除得出的结果赋值给栈顶元素
可以看到“±”号性质相似,“*/”号性质相似,因此处理过程无非就两种形式。
**思考:**如何获取运算符后面数字的值?获取该值后是否会对下一次运算结果造成影响?我们是否应该对表达式后面的值进行操作而不是前面的?
思考完上面的问题后,我先回答第三个问题,**这里的数值在表达式前后只是相对而言,参考的位置不一样,数字所在前后就不一样。**没有必要纠结数字到底是在运算符前面还是后面。我们获取num的值是以运算符出现作为判断依据的,也就是说数字后面出现运算符的时候说明这个数字获取完成了。(那么此时可以说数字在运算符前面)
解决前面两问题的其中一个做法是定义一个变量(pre_operator)记录上一次运算符的值,当遇到一个运算符不着急处理,等下一次再出现运算符后才对这一次数据进行处理。我们规定pre_operator 的初始值是加号(加号的操作是将值压入栈中),因为我们是要等下一次出现运算符后再对前一次数据处理,当遍历到表达式末尾时,如果最后面没有一个运算符我们就无法获取最后一个计算结果了,因此要在表达式后面任意加一个运算符。
代码实现
class Solution:
def calculate(self, s: str):
定义栈
stack = []