设为首页 收藏本站
查看: 1023|回复: 0

[经验分享] Python——中缀到后缀的转换(Stack)

[复制链接]

尚未签到

发表于 2018-8-4 08:09:23 | 显示全部楼层 |阅读模式
  先贴代码,剩下的结合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、传入参数,这里用的复杂一点的
DSC0000.jpg

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

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

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

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

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

  7、遇到“)”,我们的操作应该是去掉“( )”,后面加上“ + ”
  2 :去掉opstack内的“ + ” -->  3 :并返回到postfixList里面 -->  5 :删掉opstack内的“(” --> topstack==“(”循环结束
DSC0006.jpg

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

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

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

  11、传入“(”, opstack添加“(”
DSC00010.jpg

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

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

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

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

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

  17、传入“(”, opstack添加“(”
DSC00016.jpg

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

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

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

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

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

  23、我们的答案在此
DSC00022.jpg

  我们的代码及思路源自:
  http://interactivepython.org/runestone/static/pythonds/BasicDS/InfixPrefixandPostfixExpressions.html
  愿我们共同进步
  祝好

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-546188-1-1.html 上篇帖子: 关于grequests的session/cookie (python) 下篇帖子: 安装python的easy_install和pip
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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