解决前面两问题的其中一个做法是定义一个变量(pre_operator)记录上一次运算符的值,当遇到一个运算符不着急处理,等下一次再出现运算符后才对这一次数据进行处理。我们规定pre_operator 的初始值是加号(加号的操作是将值压入栈中),因为我们是要等下一次出现运算符后再对前一次数据处理,当遍历到表达式末尾时,如果最后面没有一个运算符我们就无法获取最后一个计算结果了,因此要在表达式后面任意加一个运算符。
代码实现
class Solution:
def calculate(self, s: str):
定义栈
stack = []
用于记录上一次运算符
pre_operator = ‘+’
用于记录运算符前面的值
num = 0
for c in (s+‘+’):
如果c是空白符直接跳过
if c == " ":
continue
如果c是数字
if c.isdigit():
可使用ord相减也可使用int©
num = num*10 + ord© - ord(‘0’)
如果c是运算符
elif c in “±*/”:
if pre_operator == ‘+’:
stack.append(num)
elif pre_operator == ‘-’:
stack.append(-num)
elif pre_operator == ‘*’:
栈顶元素与运算符前的数字相乘
stack[-1] = stack[-1]*num
elif pre_operator == ‘/’:
要使表达式更加精确,可写成stack[-1] = format((stack[-1]/num),‘.5f’)
stack[-1] = int(stack[-1]/num)
初始化
num = 0
记录此时的运算符
pre_operator = c
return sum(stack)
二、双栈
当表达式更为复杂时可使用双栈解法。双栈目前支持的输入的字符有0~9,±*/,(),双栈可应对较为复杂的表达式,如"3+6/-2"两运算符连续出现以及多括号嵌套"(10/(4*2+2)-3)*(4-8)"等情况。而单栈适用于常规计算,处理快易上手,二者各有优点。
单双栈异同点
双栈计算与单栈计算过程有许多相似之处。
-
都是遇到下一运算符才计算上一个运算符。
-
获取数字思路一致,都是不断遍历字符