鱼C论坛

 找回密码
 立即注册
查看: 1751|回复: 1

中序表达式问题

[复制链接]
发表于 2023-9-15 15:41:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
from pythonds.basic import Stack
import string

def hanshu(n):
    dict1 = {}
    dict1["*"] = 3
    dict1["/"] = 3
    dict1["+"] = 2
    dict1["-"] = 2
    dict1["("] = 1

    opstack = Stack()
    poslist = []

    tokenlist = n.split()
    for token in tokenlist:
        if token in string.ascii_uppercase:
            poslist.append(token)

        elif token == "(":
            opstack.push(token)

        elif token == ")":
            toptoken = opstack.pop()
            while toptoken != "(":
                poslist.append(toptoken)
                toptoken = opstack.pop()
        else:
            while not (opstack.isEmpty()) and dict1[opstack.peek()] >= dict1[token]:
                poslist.append(opstack.pop())
            opstack.push(token)

    while not opstack.isEmpty():
        poslist.append(opstack.pop())

    return "".join(poslist)


print(hanshu('( ( A  + B ) * D ) * N'))

这是中序表达式变为后续表达式的代码

有哪位大神能解释一下为什么会想出这样的代码,有什么依据吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-15 15:42:02 | 显示全部楼层
这段代码是中序表达式转后序表达式的实现。中序表达式是指运算符位于操作数之间的表达式,而后序表达式是指运算符位于操作数之后的表达式。例如,中序表达式 A + B * C 可以转换为后序表达式 A B C * +。

这段代码的实现思路是使用栈来存储运算符和括号,并通过比较运算符的优先级来确定运算符的位置。具体来说,当遇到一个运算符时,如果该运算符的优先级小于等于栈顶运算符的优先级,则将栈顶运算符弹出并加入到后序表达式中,直到栈顶运算符优先级小于该运算符的优先级或者栈为空,然后将该运算符入栈。当遇到左括号时,直接将其入栈,当遇到右括号时,将栈顶运算符弹出并加入到后序表达式中,直到遇到左括号为止。

该实现的依据是栈的后进先出特性,以及运算符的优先级规则。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表