python实现中缀表达式转后缀表达式

news2024/12/24 2:41:25

前缀、中缀、后缀表达式(逆波兰表达式)

前缀表达式称为波兰表达式,前缀表达式的运算符位于操作符之前

举例说明:(3+4)x 5 – 6 对应的前缀表达式就是- X + 3 4 5 6

 

中缀表达式转为后缀表达式:

具体步骤:(注意括号不算运算符)

  1. 初始化两个栈,其中运算符栈s1和存储中间结果的栈s2
  2. 从左到右进行扫描中缀表达式
  3. 遇到操作符将其压进s2
  4. 遇到运算符,比较其与s1栈顶运算符的优先级:
  1. 如果s1为空,或者栈顶运算符为左括号,则直接将此运算符压进栈中
  2. 否则,若优先级比栈顶运算符的高,也将运算符压入s1
  3. 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到第一小步中与s1中新的栈顶运算符相比较。

5.遇到括号时:

  1. 如果是左括号,直接压入s1中
  2. 如果是有括号,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃

6. 重复步骤2至5,直到表达是的最右边

7. 将s1中剩余的运算符依次弹出并压入s2

8. 依次弹出s2中的元素并输出,结果的逆序即中缀表达式对应的后缀表达式


# 中缀表达式 --->  后缀表达式
# 1 + ((2+3)*4) - 5 ---->  1 2 3 + 4 * + 5 -

class ArrayStack2:
    def __init__(self,masSize):
        self.maxsize = masSize
        self.stack = []
        self.top = -1

    # 判断栈是不是 满的
    def isFull(self):
        return self.top == self.maxsize - 1

    # 判断栈是不是空的
    def isEmpty(self):
        return self.top == -1

    # 将数据压入栈中
    def push(self,value):
        if self.isFull():
            print("栈已经满了!")
            return
        self.top = self.top + 1
        self.stack.append(value)

    # 将栈中的数据进行删除
    def pop(self):
        if self.isEmpty():
            print("栈已经是空的了,没法执行出栈操作!")
            return
        value = self.stack.pop()
        self.top = self.top - 1
        return value

    # 显示栈的内容,需要先从栈顶显示数据
    def showStack(self):
        if self.isEmpty():
            print("栈已经是空的了,没法执行显示操作!")
            return
        i = self.top
        while i > -1:
            print("栈中存在的数据:",self.stack[i])
            i = i -1

    # 返回运算法的优先级  有程序员决定  优先级使用数字来表示,数字越大优先级越高
    def priority(self,oper):
        if (oper == "*" or oper == "/"):
            return 1
        elif (oper == "+" or oper == "-"):
            return 0
        else:
            return -1

    # 判断是不是一个运算法
    def isOper(self,val):
        return val == "*" or val == "/" or val == "+" or val =="-"

    def isyunsuan(self,val):
        return val == "(" or val == ")"


    # 进行计算
    def cal(self,num1,num2,oper):
        if oper == "+":
            return num1 + num2
        elif oper == "-":
            return num2 - num1 # 注意顺序
        elif oper == "*":
            return num1 * num2
        elif oper == "/":
            return num2 / num1

    # 只返回最后的一个元素,但是并不是删除最后 一个元素
    def peek(self):
        return self.stack[self.top]

class Infixtohouzhui:
    def __init__(self,expression = "1+((2+3)*4)-5"):
        self.expression = expression
        self.s1 = ArrayStack2(20)
        self.s2 = []  # 直接使用list比较好
        self.flag = 0
        self.index = 0
        self.data = 1
        self.keepnum = 0

    def change(self):
        while self.index <= len(self.expression) - 1:
            if self.s1.isOper(self.expression[self.index]) == False and self.s1.isyunsuan(self.expression[self.index]) == False:
                self.keepnum = self.expression[self.index]
                while True:
                    if self.index + self.data <= len(self.expression) - 1:
                        if (self.s1.isOper(self.expression[self.index + self.data])) == False and self.s1.isyunsuan(self.expression[self.index + self.data]) == False:
                            self.flag = 1
                            self.keepnum = self.keepnum + self.expression[self.index+self.data]
                            self.data = self.data + 1
                        else:
                            break
                    else:
                        break
                self.s2.append(self.keepnum)
                self.keepnum = ""
            elif self.expression[self.index] == "(":
                self.s1.push(self.expression[self.index])

            # 如果是有括号,就将s1中的运算符,压到s2中,知道遇到左括号为止
            elif (self.expression[self.index]) == ")":
                while (self.s1.peek())!="(":
                    self.s2.append(self.s1.pop())
                self.s1.pop() # 将s1中的左括号要删除掉
            else:
                # 当s1的栈顶运算符大于新来的运算符 将s1的栈顶运算符放到s2中,然后不停的比较
                while (self.s1.isEmpty() == False and self.s1.priority(self.s1.peek())>=self.s1.priority(self.expression[self.index])):
                    self.s2.append(self.s1.pop())
                self.s1.push(self.expression[self.index])
            if self.flag:
                self.index = self.index + self.data
                self.flag = 0
                self.data = 1
            else:
                self.index = self.index + 1

        while self.s1.isEmpty() == False:
            self.s2.append(self.s1.pop())
        return self.s2

if __name__ == '__main__':
    ll = Infixtohouzhui()
    print(ll.change())









本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

概率论与数理统计——事件间的关系

包含 事件A发生必然导致事件B发生。 代数中经常用这种方法证明两个事件相等。 事件的并&#xff08;和&#xff09; A与B至少有一个发生 事件的交&#xff08;积&#xff09; A与B同时发生 无限可列个&#xff1a;能按某种规律能把他排成一个序列&#xff08;实变函数…

Typora导出Word

1.Typora导出Word配置 1.访问GitHub&#xff1a; https://github.com/jgm/pandoc/releases/tag/2.11.3.2https://github.com/jgm/pandoc/releases/tag/2.11.3.2 2.下载对应的文件 3.到本地安装Typora目录下解压 4.配置环境变量 我的电脑–属性–高级系统设置–高级–环境变量…

Python数据分析案例12——网飞影视剧数据分析及其可视化

背景介绍 Netflix是最受欢迎的媒体和视频流平台之一。他们的平台上有超过 8000 部电影或电视节目。截至 2021 年年中&#xff0c;他们在全球拥有超过 2 亿订阅者。 博主看美剧也较为多&#xff0c;像《怪奇物语》、《性爱自修室》等高分美剧都是网飞的。 对于网飞的影视剧&a…

【Docker学习系列】Docker学习1-docker安装

从本篇开始&#xff0c;凯哥将和大家一起学学docker。本篇是docker学习系列第一篇&#xff1a;安装docker。 docker安装前提条件&#xff1a;目前,centos发行版中的内核支持Docker.Docker运行在Centos7 64位上&#xff0c;要求系统为64位、linux系统内核版本为3.8以上的。凯哥所…

mybatis实战:三、mybatis多表查询的映射

依照上一期的继续 1.UserMapper.xml 除了直接对应基本数据类类型、表的实体类&#xff0c;还可能用到多表查询。 <select id"selectRolesByUserId" resultType"tk.mybatis.simple.model.SysRole">select r.id, r.role_name roleName, r.enabled, r…

一篇个人陈述应该包括这三个内容

大家好呀&#xff0c;申请季正如火如荼地进行着&#xff0c;不知道大家都忙碌得怎么样了呢&#xff1f;今天我们来聊聊个人陈述Personal statement,的撰写&#xff0c;包括一篇个人陈述应该包括哪些部分。 申请时&#xff0c;除了学习成绩等“硬背景”&#xff0c;个人陈述(PS…

五款朴实无华却又能极大提升办公效率的软件

最近后台收到好多小伙伴的私信&#xff0c;今天继续推荐五款小工具&#xff0c;都是免费使用的&#xff0c;大家可以去试试看。 1.光追动画制作——Luxion KeyShot Luxion KeyShot是一款互动性的光线追踪与全域光渲染3D渲染与动画制作软件&#xff0c;内置丰富多样的材质&…

Redis使用基础教程

本篇文章转载自&#xff1a;通俗易懂的Redis数据结构基础教程_Java程序员-张凯的博客-CSDN博客 Redis有5个基本数据结构&#xff0c;string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的数据结构&#xff0c;把这5个数据结构都吃透了&#xff0c;你…

Spring Security-全面详解(学习总结---从入门到深化)

目录 Spring Security介绍 Spring Security认证_项目搭建 Spring Security认证_内存认证 Spring Security认证_UserDetailsService Spring Security认证_数据库认证 Spring Security认证_PasswordEncoder Spring Security认证_自定义登录页面 Spring Security认证_会…

package-info.java

package-info.java 文件估计大家见过但是自己却很少去创建和使用它、因为对于一般应用来说可能真的太少见了。 它的作用主要是三个 描述包使用注解修饰包、达到修饰该包下的类声明包中使用的类和常量(这个比较少用) 描述包 package-info.java 文件 /*** 我是描述信息*/ pa…

如何用蓝牙实现无线定位(三)--本地定位显示

1. 被定位目标 本项目设计有两个定位装置&#xff0c;一个用于固定目标&#xff0c;一个用于可移动设备。在定位系统的帮助下&#xff0c;我们可以操作可移动设备向固定目标移动。假设这是一个救援场景的话&#xff0c;我们就可以把固定的目标看作等待救援的人或物&#xff0c;…

【使用 BERT 的问答系统】第 2 章 :用于自然语言处理的神经网络

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

大数据开发之词频统计传参打包成jar包发送到Hadoop运行并创建可执行文件方便运行

文章目录添加spark的jar包main传参调试打包成jar包发送到Hadoop运行使用脚本运行参考添加spark的jar包 点击Project Structure Global Libararies中 点击 选择java 然后选择spark文件里的jars下所有的jar包 然后点击ok即可。 main传参调试 首先给出词频统计代码 //包 imp…

OpenCV图像处理——光流估计

总目录 图像处理总目录←点击这里 二十二、光流估计 22.1、原理 光流 是空间运动物体在观测成像平面上的像素运动的“瞬时速度”&#xff0c;根据各个像素点的速度矢量特征&#xff0c;可以对图像进行动态分析&#xff0c;例如目标跟踪。 亮度恒定&#xff1a;同一点随着时…

HTML5期末考核大作业——学生网页设计作业源码HTML+CSS+JavaScript 中华美德6页面带音乐文化

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

LeetCode HOT 100 —— 76 .最小覆盖子串

题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串"" 。 思路 **滑动窗口&#xff1a;**题目要求返回字符串s中包含字符串t的全部字符的最小窗口&#xff0c;即包含t的…

世界杯的那些二三事

文章目录 &#x1f525;关于世界杯 &#x1f525;关于2022卡塔尔世界杯 &#x1f525;我与世界杯 ⚽分享一颗足球 ⚽实现效果 &#x1f525;关于世界杯 大力神杯 国际足联世界杯&#xff08;FIFA World Cup&#xff09;&#xff0c;简称“世界杯”&#xff0c;是由全世界…

【自然语言处理(NLP)】基于Bi-DAF的机器阅读理解

【自然语言处理&#xff08;NLP&#xff09;】基于Bi-DAF的机器阅读理解 作者简介&#xff1a;在校大学生一枚&#xff0c;华为云享专家&#xff0c;阿里云专家博主&#xff0c;腾云先锋&#xff08;TDP&#xff09;成员&#xff0c;云曦智划项目总负责人&#xff0c;全国高等学…

java+jsp基于ssm汽车配件管理系统-计算机毕业设计

项目介绍 本汽车配件管理系统是针对目前网上车企的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的汽车配件管理系统存在的问题进行分析&#xff0c;结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用目前最流行的…

利用Python生成随机密码,灰常简单,小伙伴可以试试哟

知识点 文件读写 基础语法 字符串处理 字符拼接 Python合集视频 【整整800集】Python爬虫项目零基础入门合集&#xff0c;细狗都学会了&#xff0c;你还不会&#xff1f;代码解析 导入模块 import platform import string import random将string的几大字符串拼接在一起&…