前缀、中缀、后缀表达式和二叉树

2023-11-19

概念

前缀表达式(Prefix Notation)是指将运算符写在前面操作数写在后面的不包含括号的表达式,而且为了纪念其发明者波兰数学家Jan Lukasiewicz,所以前缀表达式也叫做“波兰表达式”
后缀表达式(Postfix Notation)与之相反,是指运算符写在操作数后面的不包含括号的算术表达式,也叫做逆波兰表达式
中缀表达式(Infix Notation)就是常用的将操作符放在操作数中间的算术表达式。前缀表达式和后缀表达式相对于中缀表达式最大的不同就是去掉了表示运算符优先级的括号

与二叉树关系

前缀表达式对应于二叉树的前序遍历
中缀表达式对应于二叉树的中序遍历
后缀表达式对应于二叉树的后序遍历

表达式转换

中缀转后缀

首先介绍一个人工转换的方法,假设有一个中缀表达式a+b*c-(d+e)

1首先将这个中缀表达式的所有运算加括号((a+(b*c))-(d+e))

2然后将所有运算符放到括号后面,这样就变成了((a(bc)* )+ (de)+ )-

3把所有括号去掉abc*+de+-,最后得出的结果就是后缀表达式

上面这个方法可以在比如做题分析的时候用人脑的时候使用,接下来介绍用程序实现将中缀转换成后缀表达式的思路

1 建立一个栈,然后从左至右的遍历中缀表达式

2 如果碰到了操作数,则直接将其输出,如果碰到了操作符,这个时候则需要进行优先级的比较,如果栈为空或者栈顶的操作符的优先级比当前的低,则将当前的操作符Push入栈,如果栈顶操作符比当前的操作符的优先级高或者相同,则POP操作符并输出,直到出现前一种情况为止

3 需要注意的是对于括号需要另外注意一下,如果是’(’,则直接入栈,如果是)则要找到对应的’(’为止,并且当两者同时出现时则同时删除

下面模拟程序对a+b*c-(d+e)求中缀表达式,首先对其进行扫描

输出 a                                        栈底                                                          栈顶

输出 a                                        栈底   +                                                    栈顶

输出 a b                                    栈底   +                                                    栈顶

输出 a b                                    栈底   +  *                                                栈顶

输出 a b c                                 栈底   +  *                                                栈顶

输出 a b c *                              栈底   +                                                    栈顶

输出 a b c * +                           栈底   -                                                     栈顶

输出 a b c * +                           栈底    - (                                                  栈顶

输出 a b c * +   d                      栈底   - (                                                  栈顶

输出 a b c * +   d                      栈底  - ( +                                               栈顶

输出 a b c * +   d e                   栈底 - ( +                                               栈顶

输出 a b c * +   d e +               栈底  -(                                                     栈顶

输出 a b c * +   d e +  -            栈底                                                         栈顶

中缀转前缀

1 转换后缀表达式由于符号是要在操作数后面出现,所以操作数入栈,扫描顺序是从左向右,转换前缀表达式的话操作符需要在操作数前面出现,那么扫描顺序就应该是从右向左。

2 操作符的具体处理方式和转换到后缀表达式略有不同

3 括号的操作也是’)’直接入栈,’(’则配对’)’后一起出栈


如:       2*3/(2-1)+5*(4-1)转化后为+/*23-21*5-41

// 中缀转前缀/*

参考算法

1)求输入串的逆序。

2)检查输入的下一元素。

3)假如是操作数,把它添加到输出串中。

4)假如是闭括号,将它压栈。

5)假如是运算符,则

i)假如栈空,此运算符入栈。

ii)假如栈顶是闭括号,此运算符入栈。

iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。

iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5

6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。

7)假如输入还未完毕,跳转到步骤2

8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。


参考资料:

http://blog.csdn.net/wzy_1988/article/details/11179281#

http://www.cnblogs.com/MichaelYin/archive/2012/05/02/2479248.html

http://blog.renren.com/share/289954979/9182682231




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前缀、中缀、后缀表达式和二叉树 的相关文章

随机推荐

  • 【转】结构体中Char a[0]用法——柔性数组

    有如下定义 typedef struct char a char b 0 其中元素Char b 0 叫做柔性数组 主要用于使结构体包含可变长字段 详细内容如下 柔性数组 柔性数组结构成员 C99中 结构中的最后一个元素允许是未知大小的数组
  • css hover 控制其他元素_CSS学习小结

    css语法 Selector Dcclaration Selector Property Value CSS注释 注释 CSS Selector 选择器 id class id id class class 插入样式表 外部样式表 内部样式
  • 深入浅出SQL(6)-聪明的表设计

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 聪明的表设计 为什么要规范化 本章多是理论 请注意理解 我们到目前为止创建的表 都没有经过仔细考虑 随着数据的越来越多 我们需要考虑的更多 好让现在的WHERE子句简
  • Linux——date

    命令简介 date 根据给定格式显示日期或设置系统日期时间 print or set the system date and time 指令所在路径 bin date 命令语法 date OPTION FORMAT date u utc u
  • python计算机视觉编程(四)图像到图像的映射

    图像到图像的映射 原理 仿射变换 仿射变换是一种二维坐标到二维坐标之间的线性变换 相同平面 它保持了二维图形的 平直性 直线经过变换之后依然是直线 和 平行性 二维图形之间的相对位置关系保持不变 平行线依然是平行线 且直线上点的位置顺序不变
  • VB中Shell和ShellExecute函数的使用方法和区别

    写了一个vb的程序 用来把原来写的几个vb和vc的程序整合起来 就是使用Shell函数 结果发现 vc的程序可以很好的显示 但vb写的却一运行就最小化了 仔细查看了一下以下文章 才发现原来shell函数的默认显示模式是windowstyle
  • java公用包共享_tomcat中设置多项目共享jar;类包

    随着服务器上的tomcat部署的项目越来越多 最近在部署一个新的项目的时候出现内存溢出的错误 Exception in thread main java lang OutOfMemoryError PermGen space at java
  • 对java和面向对象的理解?

    java是一款编程语言 是面向对象很有力的影响代表 面向对象 讲社会 实际生活中所有可见的事务抽象对象 用属性和方法来描述 划分模块化引入到java面向对象 方便后期的重复利用和扩展 解决人类的需求 聪明的设计者 灌入人的思维来解决问题 可
  • OSI七层模型和TCP/IP五层模型

    一 OSI七层模型 七层模型从下往上依次为物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 各层功能如图所示 应用层 与其它计算机进行通讯的一个应用 它是对应应用程序的通信服务的 例如 一个没有通信功能的自处理程序就不能执行通信的
  • python 使用pyinstaller 打包xpinyin 问题

    打包之后 启动错误 提示 mandarin dat 未找到 于是 找到这个文件 于打包好的pin exe放一起 再次运行还是这样 查资料说 修改 pyinstaller 的hook 测试失败 转战修改源代码 增加一个函数如果 默认查找的路径
  • 2021前端开发面试题:面试中该如何与HR谈薪资?

    问题 面试中该如何与HR谈薪资 解析 HR与你谈论薪资经常有如下套路 HR 您期望的薪资是多少 你 25K OK 你已经被HR成功套路 这个时候你的最高价就是25K了 然后HR会顺着这个价往下砍 所以你最终的薪资 般都会低于25K 等你接到
  • JS获取当前网站路径的参数值

    如果要获取当前网站路径的参数值 那么可以通过这个例子来实现 比如获取页面的 id 5 page 4 代码如下
  • es ik 分词插件 词库热加载源码分析

    package org wltea analyzer dic import java io IOException import org apache http client config RequestConfig import org
  • 通过lombok减少重复劳动

    lombok 是什么 lombok是一个java开发工具 能帮助我们减少大量的重复劳动 lombok能帮助我们做什么 lombok提供了大量的注解 只要添加了这些注解 lombok就能自动完成很多代码 举个例子 我们在写java的POJO时
  • 关于三维重建的一些东西-VisualSFM+PMVS +MeshLab= PhotoScan

    三维重建 最近在写毕业论文 研究了下三维重建的一些东西 记录下来 以备留存 另外有其他的问题的朋友可以留言 这篇博文分两个部分 三维重建方法 SFM MVS 开源工具 VisualSFM PMVS Meshlab 三维重建方法主要是SFM和
  • Java中类和对象的区别

    一 类和对象 1 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象 类是对象的数据类型 类是具有相同属性和行为的一组对象的集合 简单理解 类就是对现实事物的一种描述 类的组成 属性 指事物的特征 例如 手机事物 品牌 价格
  • vite创建vue3项目及使用typescript

    1 vue3项目建议使用vite工具 安装全局的vite 创建项目 npm install g create vite app create vite app vue3 demo cd vue3 vite npm install npm r
  • IBM、甲骨文、CNCF 就谷歌对 Istio 治理的处理提出抗议

    近日来 Istio 商标转让 IBM 抗议谷歌违背承诺未将 Istio 捐献给 CNCF 的事情闹的沸沸扬扬 Google 宣布将 Istio 商标转让给 Open Usage Commons 组织 IBM 声明对 Google 违背承诺未
  • Ubuntu下通过docker安装wechat

    Ubuntu下通过docker安装微信 一 安装docker sudo apt update sudo apt upgrade sudo apt full upgrade 安装证书 sudo apt install apt transpor
  • 前缀、中缀、后缀表达式和二叉树

    概念 前缀表达式 Prefix Notation 是指将运算符写在前面操作数写在后面的不包含括号的表达式 而且为了纪念其发明者波兰数学家Jan Lukasiewicz 所以前缀表达式也叫做 波兰表达式 后缀表达式 Postfix Notat