什么是波兰表达式

我们日常的运算表达式通常是如下形式,这种成为中缀表达式,也就是运算符在运算数的中间。这种表达式人类很容易识别,并根据其进行计算,但计算机识别这种表达式非常困难。

a + b * (c - d) + e/f

因此,1920年,波兰科学家扬·武卡谢维奇(Jan ukasiewicz)发明了一种不需要括号的计算表达式的表示法将操作符号写在操作数之前,也就是前缀表达式,即波兰式(Polish Notation, PN)。上述中缀表达式转换为波兰表达式的格式如下:

+a+*b-cd/ef

从上面表达式可以看出,运算符在2个运算数的前面,因此波兰表达式也称为前缀表达式。为了便于理解,我们给出一个具体的实例,这个实例将上面的字母换成具体的数字(1 + 2 * (4 - 3) + 6/2),这个结果很容易看出来,也就是1 + 2*1 + 3 = 6。然后我们看一下波兰表达式的表示形式及运算过程。

+1+*2-4 3/ 6 2 // 从右向左扫描,当遇到运算符时计算其最近的右侧2个运算数
+1+*2-4 3 3   //先计算最右侧的数据,也就是 6/2=3
+1+*2 1 3     // 同理,4-3 = 1
+1+2 3         // 同理, 2*1= 1
+1+5
6

通过上面示例可以大概理解波兰表达式的计算过程,上面的运算符和运算数就可以通过通用的数据结构进行计算(请自己思考一下,我们后面再介绍)。

什么是逆波兰表达式

前面了解了波兰表达式,那什么是逆波兰表达式呢?波兰表达式也成为前缀表达式,而逆波兰表达式则成为后缀表达式,对比可以猜出来运算符在运算数后面的表达式就是逆波兰表达式。上述表达式如果采用逆波兰表达式则如下:

1 2  4 3 -*+ 6 2 / + //计算方式正好相反,也就是从左向右扫描
1 2 1 *+ 6 2 / +
1 2 + 6 2 / +
3 6 2 / +
3 3 +
6

从中缀表达式转换为逆波兰(后缀)表达式

从中缀表达式转换为后缀表达式的流程如下描述。需要注意的是,经过处理之后,中缀表达式中的括弧将被消除,也就是只剩下+-*/数学运算符。

1. 从左至右扫描一中缀表达式。

2. 若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈

3. 若读取的是运算符

- 该运算符为左括号"(",则直接存入运算符堆栈。

- 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止。

- 该运算符为非括号运算符:

- 若运算符堆栈栈顶的运算符为括号,则直接存入运算符堆栈。

- 若比运算符堆栈栈顶的运算符优先级高,则直接存入运算符堆栈。

- 若比运算符堆栈栈顶的运算符优先级低或者相等,则输出栈顶运算符到操作数堆栈,并将当前运算符压入运算符堆栈。

4. 当表达式读取完成后运算符堆栈中尚有运算符时,则依序取出运算符到操作数堆栈,直到运算符堆栈为空。

将中缀表达式转换成逆波兰表达式过程中,特别要注意对于中缀标到式中括号的处理。 1. 要注意的,如果算符是"(",无论入栈中栈顶级别(只看栈顶)为何直接入栈,所以,“(”的等级 只用于对其后入栈的算符进行优先级比较,在“(”入栈时是无视优先级的。 2. 在遇到")"时候找到最后进入的"(",并把"("前面所有的符号都压入出栈。不能仅凭运算符的级别来判断。

注: 逆波兰用的优先级有以下几种, 等级从高到低分别是: 1.* 2.+ - 3.( 4.)

上面关于流程的表示文字比较多,看起来可能比较头疼。为了便于理解上述流程,我们依然通过上面的实例(1 + 2 * (4 - 3) + 6/2)进行介绍。在实际操作过程中需要一个栈和一个队列,分别存储运算符和操作数。

通过上面整个过程的描述,并结合算法,相信大家对中缀表达式转换为后缀表达式(波兰表达式)已经非常清楚了。

逆波兰表达式的计算

逆波兰表达式的计算就比较简单了。以上面结果中的队列为输入,同时再准备一个栈用于运算。具体流程如下: 1. 将队列中的数据依次出队,然后压栈; 2. 在出队的过程中如果遇到运算符,则从栈中弹出2个运算数,分别作为右运算数和左运算数,进行运算; 3. 将步骤2的运算结果入栈; 4. 跳入步骤1,继续进行出队操作。 依然以上述内容为例进行介绍。 如图1中第一行左侧为形成的队列,右侧是一个空栈。将队列中操作数依次出队,入栈

在出队的过程中遇到运算符(-),此时将操作数出栈进行运算(注意这里操作数的顺序)。

重复上述操作,直到将队列中所有内容出队。

参考文献

逆波兰表达式 - wanghetao - 博客园​www.cnblogs.com中缀表达式转换成波兰表达式和逆波兰表达式【代码】 - TheXJX - 博客园​www.cnblogs.com

波兰表达式与逆波兰表达式​www.itworld123.com

前缀表达式后缀表达式_你知道波兰表达式和逆波兰表达式吗相关推荐

  1. java逆波兰式求值_波兰式、逆波兰式与表达式求值

    波兰式.逆波兰式是<数据结构>课程中讲解关于栈的时候提到的,栈是很简单的一种数据结构.但是这些理论的提出却是计算机早期发展领域的重大突破,值得仔细回味. 1. 中缀表达式 我们在数学中学到 ...

  2. 逆波兰式 java_逆波兰式(后缀表达式)的计算 中缀表达式转后缀表达式(逆波兰式)【java实现】...

    一.逆波兰式(后缀表达式)计算 思路: * 1.遍历逆波兰式的集合 * 2.当遍历的元素为数字时,入栈 stack * 3.当遍历的元素为运算符时,stack栈弹出两个数,num2 num1,并用该运 ...

  3. 波兰式、逆波兰式与表达式求值

    波兰式.逆波兰式与表达式求值 <数据结构>中关于栈的解释经常会涉及到逆波兰式,波兰式,中缀式表达式的求值问题.但是,十分惭愧,整个大一阶段, 数据结构的课程没有上够5节,没有意识要学习,吃 ...

  4. 波兰式,逆波兰式,中缀表达式相互转换

    引入波兰式与逆波兰式: 一个式子,可以分成几个层面来看.比如1 + 2 * 3,我们看它是个算式,计算机看它,那就是个字符串,所以首先必须把它拆分成计算机可以操作的数据单元,就是Tokenize.比如 ...

  5. DS栈—波兰式,逆波兰式

    题目描述 表达式有三种表示方法,分别为: 前缀表示(波兰式):运算符+操作数1+操作数2 中缀表示:操作数1+运算符+操作数2 后缀表示(逆波兰式):操作数1+操作数2+运算符 例如:a +b * ( ...

  6. D. DS栈—波兰式,逆波兰式(dsoj c++)

    题目描述 表达式有三种表示方法,分别为: 前缀表示(波兰式):运算符+操作数1+操作数2 中缀表示:操作数1+运算符+操作数2 后缀表示(逆波兰式):操作数1+操作数2+运算符 例如:a +b * ( ...

  7. 波兰式转为逆波兰式——2016年华为笔试最后一题

    题目 2016年9月6日华为笔试最后一道题(300分)为波兰式转化为逆波兰式的问题,具体题目为: 描述: 波兰表示法,是一种逻辑.算术和代数表示方法,其特点是操作符置于操作数的前面,因此也称为前缀表示 ...

  8. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式

    文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...

  9. 波兰式与逆波兰式的转换和表达式求值

    文章目录 一.前言 二.表达式 1.中缀表达式 1.1 定义 2.前缀表达式 2.1 定义 2.2 求值 3.后缀表达式 3.1 定义 3.2 求值 三.表达式转换 1.中缀表达式转换成后缀表达式 1 ...

  10. 【数据结构】波兰式、逆波兰式与中缀表达式

    目录 中缀表达式 后缀表达式 前缀表达式 计算后缀表达式结果 计算机实现中缀转后缀 中缀表达式  中缀表达式即运算符在操作数之间的表达式,常见表达式均为中缀表达式.因为中缀表达式更利于人们理解以及计算 ...

最新文章

  1. 一个WEB***的处理过程
  2. CentOS4 可用镜像及更新方式
  3. Jetty开发指导:框架
  4. 【错误记录】反射内部类报错 ( Android 使用 Hook 时反射内部类报错 )
  5. WebAPI(part8)--节点操作
  6. UVA - 11181 数学
  7. 使用Visual Studio进行单元测试
  8. DOS打印目录树到文件
  9. Hammock for REST
  10. excel处理后上传数据库
  11. cin.getline()、getline()、gets()、cin.get(),getchar()的区别
  12. WPF 入门笔记之基础
  13. 【老生谈算法】基于matlab的指纹处理和识别算法详解及程序源码——指纹识别算法
  14. 【ArcGIS微课1000例】0010:ArcGIS影像裁剪(裁剪、掩膜提取)
  15. JSP--矩形(圆)面积计算器
  16. 乡村少年宫计算机教师简介,乡村少年宫教师感言
  17. DBeaver启动报错和DBeaver安装配置
  18. 红帽Redhat—Linux磁盘管理
  19. PTA 显示指定范围的素数并求和《越努力越幸运》
  20. java list 交集 并集 差集 去重复并集

热门文章

  1. PCI Express®Basics Background | PDF
  2. 详谈RDMA(远程直接内存访问)技术原理和三种实现方式
  3. 数据报拥塞控制协议:DCCP(Datagram Congestion Control Protocol)
  4. GNU:GCC -O 优化等级
  5. Linux内存管理:内存寻址之分段机制与分页机制
  6. Linux内存管理:内存描述之内存页面page
  7. javascript的运算(小结)
  8. 思科c240 m3 服务器安装系统,2U机架式 思科UCS C240 M3让你心动
  9. 大专计算机应用基础课件,11春大专《计算机应用基础》练习课件.doc
  10. mysql join越多性能_mysqljoin的原理和优化