我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python——中缀到后缀的转换(Sta

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python——中缀到后缀的转换(Sta

先贴代码,剩下的结合Pycharm的Debug贴图一一说明

#coding:utf-8

from pythonds.basic.stack import Stack
from string import *


def infixToPostfix(infixexpr):
    # 这里创建一个字典是为了后面 优先级 的比较
    prec = {}
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1

    # 实例化
    opstack = Stack()
    postfixList = []
    
    # 把输入的字符串分割开
    tokenList = infixexpr.split()

    for token in tokenList:
        # 这里用到的是string模块中的两个方法,源代码都是手敲的字母和数字
        if token in ascii_uppercase or token in digits:
            postfixList.append(token)
        elif token == "(":
            opstack.push(token)
        elif token == ")":
            topstack = opstack.pop()
            while topstack != "(":
                postfixList.append(topstack)
                topstack = opstack.pop()
        else:
            while (not opstack.isEmpty()) and (prec[opstack.peek()] >= prec[token]):
                postfixList.append(opstack.pop())
            opstack.push(token)
    while not opstack.isEmpty():
        postfixList.append(opstack.pop())
    return " ".join(postfixList)


# print(infixToPostfix("A * B + C * D"))
print(infixToPostfix("( A + B ) * C - ( D - E ) * ( F + G )"))

咱们开始分析吧!


1、传入参数,这里用的复杂一点的

1.png


2、 实例化、创建最终生成后缀样式的 列表、将传入的字符串分隔开

2.png


3、当token==“(”时,opstack中存入“(”,因为转换成后缀就不需要用“()”表示优先级,存起来是用于做优先级的判断

3.png


4、当token为字母时,会添加到postfixList(postfixList是用于存放最终结果的列表)

4.png


5、传入“ + ”,进入while循环 --> opstack不是空的(还记得第一步是传入的“(”吗) --> 进行对应的prec对应值的比较(也就是优先级的比较) --> 不满足条件循环结束 --> opstack添加新成员“ + ”

5.png


6、传入字母,将添加到postfixList

6.png


7、遇到“)”,我们的操作应该是去掉“( )”,后面加上“ + ”

    2 :去掉opstack内的“ + ” -->  3 :并返回到postfixList里面 -->  5 :删掉opstack内的“(” --> topstack==“(”循环结束


8.png


8、传入“ * ”,由于上一次传值opstack内元素删光了,直接跳出while循环并在opstack中添加“ * ”

8.png


9、传入字母,将添加到postfixList

9.png


10、传入“ - ” --> opstack不是空的(还记得步骤8,存入的“*”吗) --> prec[" * "]>prec[" - "] --> postfixList添加“ * ”并在opstack中添加“ - ”

10.png


11、传入“(”, opstack添加“(”

11.png


12、传入字母,将添加到postfixList

12.png


13、 1 传入“ - ” -->  2 opstack不是空的(还记得之前传入的“(”吗) -->  3 prec[“(”]  !>= prec[“ - ”]跳出while循环 -->  4 opstack追加“ - ”

13.png


14、传入字母,将添加到postfixList

14.png


15、传入“)”--> 将“ - ”从opstack中删除并追加到postfixList中 --> 删除“(”

15.png


16、传入“ * ”,while循环不满足条件跳出,将“ * ”追加到opstack中

16.png


17、传入“(”, opstack添加“(”

17.png


18、传入字母,将添加到postfixList

18.png


19、传入“ + ”,进入while循环 --> opstack不是空的(还记得之前传入的“(”和“ * ”吗) --> 进行对应的prec对应值的比较(也就是优先级的比较) --> 不满足条件循环结束 --> opstack添加新成员“ + ”

19.png


20、传入字母,将添加到postfixList

20.png


21、传入“)”,取出opstack中的“ + ”并返回到postfixList中,接着删掉对应的“(”

21.png


22、tokenList列表遍历完跳出for循环,接下来就是一次取出opstack中的“ * ”和“ - ”并添加到postfixList中,再按规定格式返回结果

22.png


23、我们的答案在此

23.png



我们的代码及思路源自:

http://interactivepython.org/runestone/static/pythonds/BasicDS/InfixPrefixandPostfixExpressions.html


愿我们共同进步

祝好


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python——中缀到后缀的转换(Sta

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python——中缀到后缀的转换(Sta

先贴代码,剩下的结合Pycharm的Debug贴图一一说明#coding:utf-8from pythonds.basic.stack import Stackfrom string import *def infixToPostfix(i
2023-01-31

C++中怎么将中缀表达式转换为后缀表达式

本篇文章为大家展示了C++中怎么将中缀表达式转换为后缀表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可1.用字符数组存储整行输入
2023-06-05

python中heic后缀图片文件怎样转换成jpg格式

这篇文章主要介绍python中heic后缀图片文件怎样转换成jpg格式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!heic_to_jpg.pyimport subprocessimport osimport ioi
2023-06-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录