2021.3.13 栈学习

本文介绍了一种算法,用于将中缀表达式转换为后缀表达式,并提供了具体的Python实现代码。此外,还详细解释了算法背后的原理,包括使用栈来存储操作符的方法及其在处理操作符优先级时的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#  思路:
# 1.中缀表达式转换为全括号形式
# 2.将所有的操作符移动到子表达式所在的左括号(前缀)或者右括号(后缀)处并替代之
# 3.再删除所有的括号

# ❖在中缀表达式转换为后缀形式的处理过程中,操作符比操作数要晚输出
# 所以在扫描到对应的第二个操作数之前,需要把操作符先保存起来(栈)
# ❖而这些暂存的操作符,由于优先级的规则,还有可能要反转次序输出。
# 在A+B*C中,+虽然先出现,但优先级比后面这个*要低,所以它要等*处理完后,才能再处理。
# ❖这种反转特性,使得我们考虑用栈来保存暂时未处理的操作符

# ❖总结下,在从左到右扫描逐个字符扫描中缀表达式的过程中,采用一个栈来暂存未处理的操作符
# ❖这样,栈顶的操作符就是最近暂存进去的,当遇到一个新的操作符,就需要跟栈顶的操作符比较下优先级,再行处理。
import string


def convert(unfixstr):
    opstack = []
    postfixlist = []
    prec = {}
    prec['('] = 0
    prec['*'] = 2
    prec['/'] = 2
    prec['+'] = 1
    prec['-'] = 1
    tokenlist = unfixstr.split(' ')
    for token in tokenlist:
        if token in string.ascii_uppercase:
            postfixlist.append(token)
        elif token == '(':
            opstack.append(token)
        elif token == ')':
            toptoken = opstack.pop()
            while toptoken != '(':
                postfixlist.append(toptoken)
                toptoken = opstack.pop()
        else:
            while opstack != [] and (prec[opstack[-1]] >= prec[token]):
                postfixlist.append(opstack.pop())
            opstack.append(token)

    while opstack:
        postfixlist.append(opstack.pop())

    return ''.join(postfixlist)


print(convert('( A * B ) + ( C * D )'))

# 后缀表达式求值:
# 对于一个后序表达式,应先用一个空栈暂存操作数,同时后入栈的操作符应先计算(每个操作符只对离他最近的两个操作数进行运算)


def output(postfixstr):
    outputstack = []


    def calculate(input1,input2,op):
        if op == '+':
            return input1 + input2
        if op == '-':
            return input1 - input2
        if op == '*':
            return input1 * input2
        if op == '/':
            return input1 / input2

    postfixlist = postfixstr.split(' ')
    for token in postfixlist:
        if token in '1234567890':
            outputstack.append(token)
        elif token in '+-*/':
            input1 = outputstack.pop()
            input2 = outputstack.pop()
            temp = calculate(int(input2), int(input1), token)
            outputstack.insert(0, temp)

    return outputstack[0]


print(output('1 2 * 3 4 * +'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idkmn_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值