def calculate(s) -> float:
def domath(op,op1,op2):
if op=='*':
return op1*op2
elif op=='/':
return op1/op2
elif op=='+':
return op1+op2
elif op=='-':
return op1-op2
else: # ^
return op1**op2
def doOperand(op):
operand2 = operandStack.pop()
operand1 = operandStack.pop()
result = domath(op,operand1,operand2)
operandStack.push(result) #求出的值压回操作数栈
prec = {'^':4,'*':3,'/':3,'+':2,'-':2,'(':1} #运算符优先级
opStack = Stack() #运算符栈
operandStack = Stack() #操作数栈
tokenlist = s.split()
for token in tokenlist:
if token.isnumeric(): #检测字符串是否只由数字组成
operandStack.push(float(token)) #操作数入栈
elif token == '(':
opStack .push(token) #左括号入栈
elif token == ')':
#碰到右括号,把栈里左括号上面的运算符都弹出求值
topToken = opStack.pop()
while topToken != '(': #做计算,取下一个操作符
doOperand(topToken)
topToken = opStack.pop()
else: # 某个运算符
while (not opStack.isEmpty()) and \
(prec[opStack.peek()]>=prec[token]): #做计算
topToken = opStack.pop()
doOperand(topToken)
opStack.push(token) #注意最后让当前运算符进栈
#表达式遍历完后,栈里剩下的操作符继续求值
while not opStack.isEmpty():
topToken = opStack.pop()
doOperand(topToken)
return operandStack.pop()
中缀表达式求值
最新推荐文章于 2024-07-20 17:12:48 发布