(尝试)用栈实现中缀表达式的计算——Python

文章讨论了一次尝试使用栈来解决中缀表达式计算的问题,虽然代码在处理某些情况时出错,但给出了一个基础的实现框架。代码以Python编写,包括两个栈,一个用于存储数字,另一个用于存储运算符。示例显示,当输入格式严格遵循规则时,计算结果正确,但去除括号可能导致错误的结果。作者计划在未来完善这个功能。
摘要由CSDN通过智能技术生成

        一次失败的小尝试,利用栈来完成中缀表达式的计算 ,能力有限,写到后面逻辑就完全乱了因此有很多问题。最后返回来看发现当时写的又多又乱,有很大问题,但也不太想改了。

        对于表达式的输入,仅限于字符串,格式也有要求,每个字符之间都要有空格,并且需要用“()”来说明运算的顺序

代码如下,以后有时间会来完善,改正错误

class Stack:
    def __init__(self):
        self.List=[]
    def push(self,item):
        self.List.append(item)
    def pop(self):
        return self.List.pop()
    def isEmpty(self):
        return self.List==[]
    def peek(self):
        return self.List[-1]
    def size(self):
        return len(self.List)
def calculate(a,b,c):
    if b=='+':
        return a+c
    elif b=='*':
        return a*c
    elif b=='-':
        return c-a
    elif b=='/':
        return c/a
    
def InfixtoPstfix(infix):
    Dict={}
    Dict['+']=1
    Dict['-']=1
    Dict['*']=2
    Dict['/']=2
    Dict['(']=3
    Dict[')']=3
    index=0
    infixList=infix.split()
    numStack=Stack()#数字栈
    opStack=Stack()#操作栈
    while index <= len(infixList)-1:
        if infixList[index] not in Dict and infixList[index] != ')':
            numStack.push(int(infixList[index]))
        elif infixList[index] == '(':#Push
            opStack.push(infixList[index])                 
        elif infixList[index] == ')':
            while not opStack.isEmpty() and opStack.peek() in '+-*/':
                numStack.push(calculate(numStack.pop(),opStack.pop(),numStack.pop()))
            if opStack.pop() == '(':
                while not opStack.isEmpty() and opStack.peek() in '+-*/':
                    numStack.push(calculate(numStack.pop(),opStack.pop(),numStack.pop()))
                opStack.push(infixList[index])
        elif opStack.isEmpty() or Dict[infixList[index]] > Dict[opStack.peek()] :#Push
            opStack.push(infixList[index]) 
        elif Dict[infixList[index]] <= Dict[opStack.peek()]:
            while not opStack.isEmpty() and opStack.peek() in '+-*/':
                numStack.push(calculate(numStack.pop(),opStack.pop(),numStack.pop()))
            opStack.push(infixList[index])
        index =index + 1
    if opStack.isEmpty():
        return numStack.pop()
    elif not opStack.isEmpty():
        while not opStack.isEmpty() and opStack.peek() in '+-*/':
            numStack.push(calculate(numStack.pop(),opStack.pop(),numStack.pop()))
        return numStack.pop()

#举个例子,输入的格式需要很标准,不然计算不准确       
a = '( 1 + ( 2 * ( 6 - 3 ) ) * 5 ) - 10 )'
b = InfixtoPstfix(a)
print('计算:',a)
print('计算结果', b)

运行结果如下:

计算: ( 1 + ( 2 * ( 6 - 3 ) ) * 5 ) - 10 )
计算结果 21

结果还是正确的,但是去掉多余的括号,结果就会变成

计算: 1 + 2 * ( 6 - 3 ) * 5 - 10
计算结果 25

未完待续,有时间会来改正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值