前缀表达式、中缀表达式和后缀表达式

前缀、中缀、后缀表达式

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

举例:
中缀表达式: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 -

小结

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

原文地址:https://www.cnblogs.com/zzliu/p/10801113.html

时间: 2024-11-08 15:41:12

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

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

中缀表达式与前、后缀表达式转化简单的技巧[转]

35,15,+,80,70,-,*,20,/ //后缀表达方式 (((35+15)*(80-70))/20)=25 //中缀表达方式 /,*,+,35,15,-,80,70, 20 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式) 我这里教你一种也许你老师都没跟你讲的简单转换方式 一个中缀式到其他式子的转换方法 这里我

中缀表达式转换为前、后缀表达式转化简单的技巧[转]

原文来源 https://www.cnblogs.com/Hslim/p/5008460.html 这里我给出一个中缀表达式 1 a+b*c-(d+e)    //中缀表达 第一步:按照运算符的优先级对所有的运算单位加括号 式子变成:((a+(b*c))-(d+e))第二步:转换前缀与后缀表达式        前缀:把运算符号移动到对应的括号前面                则变成:-( +(a *(bc)) +(de)) //这里移动时                把括号去掉:-+a*bc

中缀表达式检测并转换后缀表达式,计算后缀表达式的结果

实现代码如下 #include <iostream> #include <stack> #include <ctype.h> using namespace std; //这里的数字只能是一位 //扫描表达式是否合法,合法返回0,否则返回非0 int Scanner(const char *str) { stack<char*> s; if(str==NULL) { return -1; } char *p=(char*)str; while(*p!='\0

表达式求值(后缀表达式求值)

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束.这个表达式里只包

逆波兰表达式的实现(也叫后缀表达式)

本文主要偏重实现如何将字符串表达式转换为逆波兰表达式. 关于其讲解参考我转载的一篇博文:http://www.cnblogs.com/vpoet/p/4659546.html 先说说优先级: ()    +-     */%(从左到右递增) 下面先简单再梳理一下: 1.建立两个栈,一个为N(数据栈),一个为OP(运算符栈) 2.将字符串从左向右遍历,把数据压入数据栈,把运算符压入运算符的栈   关于运算符压栈的规则:⑴ 如果OP为空直接将运算符压入栈 ⑵ 如果不为空,则比较待入栈元素和栈顶元素的

栈实现综合计算器(中缀表达式),前缀,中缀,后缀表达式,逆波兰计算器

思路: 代码:实现多位数的运算 public class Calculator { public static void main(String[] args) { //根据前面老师思路,完成表达式的运算 String expression = "7*2*2-5+1-5+3-4"; // 15//如何处理多位数的问题? //创建两个栈,数栈,一个符号栈 ArrayStack2 numStack = new ArrayStack2(10); ArrayStack2 operStack =

栈的应用之中缀表达式转后缀表达式

1,中缀表达式的定义及为什么要将中缀表达式转换为后缀表达式? 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值.对计算机来说,计算前缀或后缀表达式的值要比中缀表达式简单. 比如,计算机计算后缀表达式的过程如下----后缀表达式的计算机求值: 从左

后缀表达式与中缀表达式互转的理论知识【转】

首先,以下理论来源:http://www.cnblogs.com/hapjin/p/4740801.html 1,后缀表达式计算方式中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法.虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值.对计算机来说,计算前缀或后缀表达式的值要比中缀表达式简单. 比如,计算机计算后缀表达式的过

java中缀表达式转后缀表达式

四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式 数字直接输出为后缀表达式一部分 如果是符号,则判断与栈顶元素的优先级 高于栈顶元素优先级直接入栈 低于或等于栈顶优先级栈顶元素出栈并输出为后缀表达式一部分(注意这里是递归比较栈顶元素的优先级并出栈),最后将当前元素入栈直到遍历完中缀表达式,最终输出后缀表达式 下面是自己的实现源码 package com.yhq.demospringboot; import org.apache.commons.lang