首页 > 其他分享 >前缀、中缀、后缀表达式

前缀、中缀、后缀表达式

时间:2022-10-04 22:37:51浏览次数:48  
标签:中缀 压入 后缀 运算符 表达式 前缀

前缀、中缀、后缀表达式是对表达式的不同记法,其区别在于运算符相对于操作数的位置不同,前缀表达式的运算符位于操作数之前,中缀和后缀同理

举例:
中缀表达式:1 + (2 + 3) × 4 - 5
前缀表达式:- + 1 × + 2 3 4 5
后缀表达式:1 2 3 + 4 × + 5 -

中缀表达式

中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。
虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单

前缀表达式

前缀表达式的运算符位于两个相应操作数之前,前缀表达式又被称为前缀记法或波兰式

前缀表达式的计算机求值

  1. 从右至左扫描表达式
  2. 遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈
  3. 重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果

示例:
计算前缀表达式的值:- + 1 × + 2 3 4 5

  1. 从右至左扫描,将5,4,3,2压入堆栈;
    2)遇到+运算符,弹出2和3(2为栈顶元素,3为次顶元素),计算2+3的值,得到5,将5压入栈;
    3)遇到×运算符,弹出5和4,计算5×4的值,得到20,将20压入栈;
    4)遇到1,将1压入栈;
    5)遇到+运算符,弹出1和20,计算1+20的值,得到21,将21压入栈;
    6)遇到-运算符,弹出21和5,计算21-5的值,得到16为最终结果

可以看到,用计算机计算前缀表达式是非常容易的,不像计算后缀表达式需要使用正则匹配

后缀表达式

后缀表达式与前缀表达式类似,只是运算符位于两个相应操作数之后,后缀表达式也被称为后缀记法或逆波兰式

后缀表达式的计算机求值

与前缀表达式类似,只是顺序是从左至右:

  1. 从左至右扫描表达式
  2. 遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素op 栈顶元素 ),并将结果入栈
  3. 重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果

示例:
计算
计算后缀表达式的值:1 2 3 + 4 × + 5 -

1)从左至右扫描,将1,2,3压入栈;
2)遇到+运算符,3和2弹出,计算2+3的值,得到5,将5压入栈;
3)遇到4,将4压入栈
4)遇到×运算符,弹出4和5,计算5×4的值,得到20,将20压入栈;
5)遇到+运算符,弹出20和1,计算1+20的值,得到21,将21压入栈;
6)遇到5,将5压入栈;
7)遇到-运算符,弹出5和21,计算21-5的值,得到16为最终结果

中缀表达式转化为前缀和后缀表达式

转化步骤:

  1. 按照运算符的优先级对所有的运算单位加括号
  2. 将运算符移动到对应括号的前面(前缀表达式)或后面(后缀表达式)
  3. 去掉括号,得到前缀或后缀表达式

示例:

中缀表达式:1+(2+3)×4-5

1)加括号
式子变成 ((1+((2+3)×4))-5)

2)移动运算符

对于前缀表达式,变成了 -(+(1×(+(23)4))5)

对于后缀表达式:变成了((1((23)+4)×)+5)-

3)去掉括号
前缀表达式: - + 1 × + 2 3 4 5
后缀表达式:1 2 3 + 4 × + 5 -

小结

  • 前缀、中缀、后缀是根据运算符与操作数的相对位置来划分的
  • 中缀表达式符合人的计算习惯,而前缀和后缀表达式适合计算机计算
  • 前缀表达式和后缀表达式计算的时候都是从一个方向扫描表达式,遇到数字压入栈,遇到运算符弹出栈顶的两个数进行运算并将结果入栈,重复知道结束
  • 前缀和后缀表达式已经内在地包含运算顺序,因此不用括号来确定优先级


 



标签:中缀,压入,后缀,运算符,表达式,前缀
From: https://blog.51cto.com/u_15707676/5731959

相关文章

  • 树上前缀和
    设sum[i]表示节点i到根节点的权值总和。如果是点权,x,y路径上的和为sum[x]+sum[y]-sum[lca]-sum[fa[lca]]如果是边权,x,y路径上的和为sum[x]+sum[y]-2*sum[lca]边前缀和......
  • 如何推前缀和式子
    我们设\(\operatorname{f}_k(n)=\sum\limits_{i=1}^{n}i^k\)如果已知\(\operatorname{f}_{k-1}(n)\),如何推导至\(\operatorname{f}_k(n)\)?首先发现:\[\operatorna......
  • 用栈模拟计算器以及中缀转后缀表达式(逆波兰表达式)
    后缀表达式(逆波兰表达式)运算方法从左向右读取表达式遇到数字就压入栈中遇到运算符就弹出栈顶和次顶元素。用次顶元素运算符栈顶元素,并将运算结果压入栈中,直到栈......
  • 删除名字含有特定前缀的git仓库分支
    我想保留一个仓库中以特定字符串为前缀的分支,还想按照commit时间保留同一前缀的指定数量的分支,删除分支的脚本如下:#!/usr/bin/envpython#-*-coding:utf8-*-#coding:u......
  • 中缀表达式转后缀、前缀记录
    波兰表示法与逆波兰表示法它们都是对表达式的记法,因此也被称为前缀记法、后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操......
  • 后缀数组小结
    后缀数组小结借用了一下别人的\(\rmblog\)。简介介绍一下基本数组。我们把原串\(\rmA\)的所有后缀按字典序从小到大排个序,则排名为\(\rmi\)的字符串是以第\(......
  • P2671 [NOIP2015 普及组] 求和(洛谷前缀和
    P2671[NOIP2015普及组]求和1//(x+z)*(num[x]+num[z])=2//(x1+x2)*(y1+y2)+(x1+x3)*(y1+y3)+(x2+x3)*(y2+y3)3//=x1*(y1*(n-2)+y1+y2+...+yn)4//+x2*(y2*......
  • Ubuntu更改名称的语法 | Ubuntu Linux更改文件名称 后缀 批量
    ubuntu下如何批量修改文件后缀名://正确的方法是在命令行中输入rename's/\.JPG/.jpg/'*.JPG//【注意】在单引号中的最后一个'/'符号不能少!//意思是:把当前文......
  • docker配置阿里云加速器(修改daemon.json后缀为conf)
    问题:docker无法拉取镜像,根据网上教程添加 /etc/docker/daemon.json后仍然失败。解决方法:将daemon.json文件名改为daemon.conf 后成功解决问题。网上常见配置方......
  • 1、python 基础知识-文件编号排序及指定后缀名文件删除
    问题描述:需要对一些文件进行删除和存在一对一的文件保存(1)自动删除指定文件后缀名文件:importsyscurrDir=sys.path[0]importosdefremoveFile(dir,postfix):ifos.pat......