实现
stack实现
class Stack:
def __init__(self):
self.list = []
def add_data(self, data):
self.list.append(data)
def pop(self):
if len(self.list) != 0:
return self.list.pop(-1)
else:
print("空栈无法弹出数据")
def peek(self):
if self.list:
return self.list[-1]
else:
return None
def is_empty(self):
return len(self.list) == 0
复制代码
计算器实现
跟视频老师的后缀表达式有点不一样,但测试了很多式子,没有出错,因为是对的
from stack import Stack
import re
class Calculator:
"""
1.首先要中缀转后缀
2.后缀表达式的计算
"""
def __init__(self):
# 存放操作符
self.operatorStack = Stack()
# 存放最终的后缀表达式
self.expression = []
# 判断是数字还是操作符
def whichType(self, char):
if 48 <= ord(char) <= 57:
return "NUM"
else:
return "OPERATOR"
# 传入2个数字和操作符计算,-和/是 num2在前
def calculate(self, num1, num2, operator):
if operator == "+":
return num1 + num2
elif operator == "-":
return num2 - num1
elif operator == "*":
return num1 * num2
elif operator == "/":
return num2 / num1
# 中缀转后缀
def infixToSuffix(self, expression):
# 指针,从头指到尾
pointer = 0
while True:
# 数字,考虑多位数情况
if self.whichType(expression[pointer]) == "NUM":
num = ""
while self.whichType(expression[pointer]) == "NUM":
num += expression[pointer]
# pointer = len(expression)的情况就是到了式子的尾部了,跳出循环
if pointer != len(expression) - 1:
pointer += 1
else:
break
# 后缀表达式加入多位数
self.expression.append(int(num))
# 操作符 + - * / ( )
else:
# 操作符是(或者operatorStack为空
if expression[pointer] == "(" or self.operatorStack.is_empty():
self.operatorStack.add_data(expression[pointer])
# 如果操作符是),一直pop到 (
elif expression[pointer] == ")":
while self.operatorStack.peek() != "(":
self.expression.append(self.operatorStack.pop())
# pop出 (
self.operatorStack.pop()
# 操作符是+或-的情况
elif expression[pointer] == "+" or expression[pointer] == "-":
# 当上一个操作符是+-*/任何一个都需要先把操作符pop出,举个例子:5-3+1,这个式子就会报错,
# self.operatorStack.peek() is not None是因为operatorStack为空时会返回None
while self.operatorStack.peek() != "(" and self.operatorStack.peek() is not None:
self.expression.append(self.operatorStack.pop())
self.operatorStack.add_data(expression[pointer])
# 操作符是 * 或 /
elif expression[pointer] == "*" or expression[pointer] == "/":
# 上一个操作符是*或/
while self.operatorStack.peek() == "*" or self.operatorStack.peek() == "/":
self.expression.append(self.operatorStack.pop())
self.operatorStack.add_data(expression[pointer])
pointer += 1
if pointer == len(expression) - 1:
break
# 将操作符栈剩余的操作符弹出
while not self.operatorStack.is_empty():
self.expression.append(self.operatorStack.pop())
return self.expression
def suffixCalculate(self, expression):
numStack = Stack()
pointer = 0
while True:
# 数字就加入数栈
if re.match("[0-9]+$", str(expression[pointer])):
while re.match("[0-9]+$", str(expression[pointer])):
numStack.add_data(int(expression[pointer]))
pointer += 1
# 操作符的话,弹出2个数字和操作符计算后加入数栈
else:
num1 = numStack.pop()
num2 = numStack.pop()
numStack.add_data(self.calculate(num1, num2, expression[pointer]))
pointer += 1
if pointer == len(expression):
break
return numStack.pop()
cal = Calculator()
# a = cal.infixToSuffix("10-2*(3+4)+5*2+6")
a = cal.infixToSuffix("(((10+30)*100)/50)/2-1000+100*10")
# a = cal.infixToSuffix("3*5-10")
print(a)
print(cal.suffixCalculate(a))
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END