| 计算器
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
| 题解
class Solution:
"""
解题思路: 利用两个栈来解决
第一个栈存放被计算的数字,第二个栈存放运算符
计算规则: 1.当第二个栈不为空时, 又有运算符需要进栈,
此时判断当前运算符与栈内运算符的运算级别,
如果栈内的运算符级别高于要进栈的运算符运行级别或者同级别,则计算栈内运算符,
计算后把对应的运算符和计算对应的数字移出栈,把计算的结果添加到第一个栈中,
把需要入栈的运算符添加到第二个栈中,下附代码
"""
def __init__(self):
self.stack = list()
self.op_stack = list()
self.tmp_num = ''
def calculate(self, s: str) -> int:
for i in s:
if i.isdigit():
self.tmp_num += i
elif i in '+-*/':
self.stack.append(int(self.tmp_num))
self.tmp_num = ''
if self.op_stack and self.op_stack[-1] == '*':
self.arithmetic()
if self.op_stack and self.op_stack[-1] == '/':
self.arithmetic()
if self.op_stack and i in '+-':
self.arithmetic()
self.op_stack.append(i)
if self.tmp_num:
self.stack.append(int(self.tmp_num))
while len(self.op_stack) :
self.arithmetic()
return self.stack[0]
def arithmetic(self):
num1, op, num2 = self.remove()
if op == '*':
self.stack.append(num2 * num1)
elif op == '/':
self.stack.append(int(num2 / num1))
elif op == "+":
self.stack.append(num2 + num1)
elif op == '-':
self.stack.append(num2 - num1)
def remove(self):
op = self.op_stack.pop()
num1 = self.stack.pop()
num2 = self.stack.pop()
return num1, op, num2