第二章 前缀表达式、中缀表达式、后缀表达式的转换

合集下载

前缀、中缀、后缀表达式

前缀、中缀、后缀表达式

前缀、中缀、后缀表达式在计算机科学中,表达式是由操作符和操作数组成的数学式子。

为了方便计算机进行计算,表达式可以以不同的形式表示,包括前缀、中缀和后缀表达式。

一、前缀表达式前缀表达式,也称为波兰表达式,是将操作符写在操作数之前的一种表达式形式。

例如,加法操作符写在两个操作数之前,减法操作符写在两个操作数之前,以此类推。

前缀表达式的一个特点是,操作符和操作数之间没有括号,而是通过空格或其他分隔符进行分隔。

这种形式的表达式可以直接被计算机解析和计算。

例如,表达式"+ 2 3"可以被解析为2加3,得到结果5。

同样地,表达式"- 5 3"可以被解析为5减去3,得到结果2。

二、中缀表达式中缀表达式是我们平时最常见的表达式形式,操作符位于两个操作数之间。

例如,"2 + 3"就是一个中缀表达式。

中缀表达式的一个特点是使用了括号来表示优先级,以及操作符的结合性。

例如,"(2 + 3) * 4"表示先计算括号内的加法,再将结果乘以4。

中缀表达式的解析和计算相对复杂,需要考虑操作符的优先级和结合性,以及括号的使用。

为了方便计算机进行计算,通常需要将中缀表达式转换为其他形式。

三、后缀表达式后缀表达式,也称为逆波兰表达式,是将操作符写在操作数之后的一种表达式形式。

例如,"2 3 +"就是一个后缀表达式。

后缀表达式的一个特点是,操作符和操作数之间也没有括号,而是通过空格或其他分隔符进行分隔。

这种形式的表达式同样可以直接被计算机解析和计算。

后缀表达式的解析和计算相对简单,不需要考虑操作符的优先级和结合性,也不需要使用括号。

计算机可以通过从左到右依次处理操作数和操作符,最终得到结果。

例如,表达式"2 3 +"可以被解析为2加3,得到结果5。

同样地,表达式"5 3 -"可以被解析为5减去3,得到结果2。

“中序表达式”转换为“前序表达式”、“后序表达式”

“中序表达式”转换为“前序表达式”、“后序表达式”

“中序表达式”转换为“前序表达式”、“后序表达式” 上周末参照书本写了个“计算器”的程序,其中最令我费解的就是“前序表达式”、“后续表达式”,好像记得⽼师在上课的时候讲过,估计当时也没听懂,看的稀⾥糊涂的,不过现在⼤概明⽩了…… 在此仅做以笔记。

⾸先看下⾯所⽰表格:中序表达式2*3/(2-1)+3*(4-1)前序表达式+/*23-21*3-41后序表达式23*21-/341-*+ 中序表达式对我们⽽⾔是很直观的(我们平时接触的就是这个),但计算机处理起来⽐较⿇烦(括号、优先级之类的),前序和后序表达式中没有括号,⽽且在计算中只需单向扫描,不需要考虑运算符的优先级。

以前序表达式“+/*23-21*3-41”为例,从右往左,先取出两个操作数“1”、“4”和⼀个运算符“-”,计算“4-1”,将结果3回填到字符串中,现在字符串变为“+/*23-21*33”。

再从右⾄左取两个数“3”、“3”和“*”,计算“3*3”,将结果“9”回填到字符串,得“+/*23-219’”, 再取数,连续取出“9”、“1”、“2”,直到取出⼀个运算符“-”,将与运算符最近的两个操作数进⾏计算,即“2-1”得“1”,回填字符串中,现在为“+/*239” 重复上述步骤,取出“2*3”=6,回填字符串得到“+/619”, 再取“6/1”=6,得到“+69”, 再取“6+9”=15。

运算完毕。

即从右⾄左取数,直到取出⼀个运算符,将刚取出的紧挨着运算符的两个操作数按运算符进⾏计算,结果回填⾄运算符。

重复该步骤,直到最后只剩下⼀个字符串则剩下的字符串即为结果。

后序表达式的字符串扫描⽅式正好和前序相反,是从左往右扫描,规则类似。

中序表达式转前序表达式步骤1、反转输⼊字符串,如“2*3/(2-1)+3*(4-1)” 反转后为“ )1-4(*3+)1-2(/3*2”,2、从字符串中取出下⼀个字符 2.1.如果是操作数,则直接输出 2.2.如果是“)”,压⼊栈中 2.3.如果是运算符但不是“(”,“)”,则不断循环进⾏以下处理 2.3.1.如果栈为空,则此运算符进栈,结束此步骤 2.3.2.如果栈顶是“)”,则此运算符进栈,结束此步骤 2.3.2.如果此运算符与栈顶优先级相同或者更⾼,此运算符进栈,结束此步骤 2.3.4.否则,运算符连续出栈,直到满⾜上述三个条件之⼀,然后此运算符进栈 2.4、如果是“(”,则运算符连续出栈,直到遇见“)”为⽌,将“)”出栈且丢弃之3、如果还有更多的字符串,则转到第2步4、不在有未处理的字符串了,输出栈中剩余元素5、再次反转字符串得到最终结果 我第⼀次看到这个的时候就没看懂是什么意思,在⽹上查了点,⼜瞪了它好久才明⽩了,就以“2*3/(2-1)+3*(4-1),”为例做以下说明: 2*3/(2-1)+3*(4-1),反转得“ )1-4(*3+)1-2(/3*2 ”; 取第⼀个字符串为“)”,⼊栈(此时栈中为“)”); 取下⼀个“1”,是操作数,直接输出(⽬前输出“1”); 取下⼀个“-”,既不是“)”,也不是“(”,则转到2.3,此时栈顶为“)”,则该运算符进栈(栈中为“-、)”); 取下⼀个“4”,直接输出(⽬前输出的是“14”); 取下⼀个“(”,运算符连续出栈(栈中此时为“-、)”),直到遇见“)”,此时输出“-”(⽬前输出“14-”,栈为空); 取下⼀个“*”,既不是“)”,也不是“(”,则转到2.3,进栈(栈为空); 取下⼀个“3”,直接输出(⽬前输出“14-3”); 取下⼀个“+”,此时栈顶为“*”,“+”的优先级⽐“*”低(2.3.4),则运算符连续出栈(只有⼀个*出栈,此时栈为空符合2.3.1,继续下⼀步),“+”进栈; 取下⼀个“)”,进栈(此时栈中为“)、+”); 取下⼀个“1”直接输出(⽬前输出为14-3*1); 取下⼀个“-”,此时栈顶为“)”,“-”进栈(栈中此时为“-、)、+”); 取下⼀个“2”,直接输出(⽬前输出“14-3*12”); 取下⼀个“(”,运算符连续出栈,直到遇见“)”,此时栈中为“-、)、+”,输出-,且抛弃“)”,此时输出为“14-3*12-”,栈中为“+”; 取下⼀个“/”,优先级⽐栈顶“+”⾼,此运算符进栈; 取下⼀个“3”,直接输出(此时输出“14-3*12-3”); 取下⼀个“*”,优先级⽐栈顶“+”⾼,此运算符进栈; 取下⼀个“2”,输出(此时输出“14-3*12-32”); 不在有未处理的运算符,输出栈中剩余元素,结果的“14-3*12-32*/+”; 反转字符串的“+/*23-21*3-41”。

前缀中缀后缀相互转换

前缀中缀后缀相互转换

前缀中缀后缀相互转换符号说明•为了表示简便,程序中符号如下•¬, 非•∨,或•∧, 与•→, 推出•=, 等价中缀转后缀•例:P∨Q∧R∨(T=S)输出:PQR∧∨TS=∨算法流程:1.初始化两个栈:运算符栈S1,储存中间结果的栈S2;2.从左至右扫描中缀表达式:1.遇到操作数2.遇到运算符3.遇到括号P∨Q∧R∨(T=S)中缀转后缀算法流程:1.初始化两个栈:运算符栈S1,储存中间结果的栈S2;2.从左至右扫描中缀表达式:1.遇到操作数:直接压入S22.遇到运算符3.遇到括号P∨Q∧R∨(T=S)P中缀转后缀算法流程:1.初始化两个栈:运算符栈S1,储存中间结果的栈S2;2.从左至右扫描中缀表达式:1.遇到操作数2.遇到运算符:1.如果S1为空,或S1栈顶为左括号“(”,该运算符压入S1;P∨Q∧R∨(T=S)2.若优先级高于栈顶运算符,该运算符压入S1;3.否则,S1栈顶运算符弹出并压入S2,重新进行2-2操作。

3.遇到括号∨P中缀转后缀算法流程:1.初始化两个栈:运算符栈S1,储存中间结果的栈S2;2.从左至右扫描中缀表达式:1.遇到操作数:直接压入S22.遇到运算符3.遇到括号P∨Q∧R∨(T=S)QP∨中缀转后缀算法流程:1.初始化两个栈:运算符栈S 1,储存中间结果的栈S 2;2.从左至右扫描中缀表达式:1.遇到操作数2.遇到运算符:1.如果S 1为空,或S 1栈顶为左括号“(”,该运算符压入S 1;2.若优先级高于栈顶运算符,该运算符压入S 1;3.否则,S 1栈顶运算符弹出并压入S 2,重新进行2-2操作。

3.遇到括号P ∨Q ∧R ∨(T =S)P ∨Q ∧中缀转后缀算法流程:1.初始化两个栈:运算符栈S 1,储存中间结果的栈S 2;2.从左至右扫描中缀表达式:1.遇到操作数:直接压入S 22.遇到运算符:3.遇到括号P ∨Q ∧R ∨(T =S)P ∨Q ∧R中缀转后缀算法流程:1.初始化两个栈:运算符栈S 1,储存中间结果的栈S 2;2.从左至右扫描中缀表达式:1.遇到操作数2.遇到运算符:1.如果S 1为空,或S 1栈顶为左括号“(”,该运算符压入S 1;2.若优先级高于栈顶运算符,该运算符压入S 1;3.否则,S 1栈顶运算符弹出并压入S 2,重新进行2-2操作。

前缀中缀后缀表达式转换 题目

前缀中缀后缀表达式转换 题目

前缀中缀后缀表达式转换题目摘要:1.前缀表达式转换成中缀表达式的方法2.中缀表达式转换成后缀表达式的方法3.常见的前缀、中缀和后缀表达式示例4.实践操作:转换实例正文:一、前缀表达式转换成中缀表达式的方法前缀表达式是指由运算符和操作数组成的一种表达式,其中运算符放在操作数之前。

将前缀表达式转换为中缀表达式,主要是将运算符插入到相应的操作数之间。

以下是一个简单的转换方法:1.遍历前缀表达式,遇到运算符,将其插入到操作数之间。

2.若遇到左括号,将其与当前操作数一起放入一个队列。

3.遇到右括号,从队列中弹出两个操作数,进行运算,并将结果放入队列。

4.直到队列为空,依次弹出队列中的操作数,进行运算,得到中缀表达式。

二、中缀表达式转换成后缀表达式的方法中缀表达式是指由运算符和操作数组成的一种表达式,其中运算符放在操作数之间。

将中缀表达式转换为后缀表达式,主要是根据运算符的优先级和结合性进行排序。

以下是一个简单的转换方法:1.遍历中缀表达式,遇到操作数,将其放入一个栈。

2.遇到运算符,根据其优先级和结合性,从栈中弹出相应的操作数进行运算,并将结果放入栈。

3.直到栈为空,依次弹出栈中的操作数,得到后缀表达式。

三、常见的前缀、中缀和后缀表达式示例前缀表达式:+(a*b)中缀表达式:a*b+后缀表达式:ab*+四、实践操作:转换实例1.转换前缀表达式:+(a*(b+c))中缀表达式:a*(b+c)+后缀表达式:abc*+2.转换前缀表达式:-a*(b-c)中缀表达式:-a*(b-c)后缀表达式:-abc*+通过以上内容,我们可以掌握前缀表达式、中缀表达式和后缀表达式的转换方法。

中缀式和后缀式的相互转换

中缀式和后缀式的相互转换

中缀式和后缀式的相互转换中缀式和后缀式是数学表达式的两种常见表示方式。

中缀式是我们常见的表达式形式,例如"3 + 4 * 5",而后缀式是将运算符放在操作数后面表示,例如"3 4 5 * +"。

将中缀式转换为后缀式可以通过使用栈和优先级规则来完成。

具体步骤如下:1. 创建一个空栈和一个空字符串后缀表达式2. 从左到右扫描中缀表达式的每个元素3. 如果遇到操作数,则将其添加到后缀表达式中4. 如果遇到运算符,则将其与栈顶运算符进行比较:- 如果栈为空或栈顶是左括号"(",则将运算符入栈- 如果运算符优先级高于栈顶运算符,则将运算符入栈- 否则,将栈顶运算符弹出并添加到后缀表达式中,直到栈为空或栈顶是左括号为止,然后将当前运算符入栈5. 如果遇到左括号"(",则将其入栈6. 如果遇到右括号")",则将栈顶运算符弹出并添加到后缀表达式中,直到遇到左括号为止,然后将左括号弹出(左括号不添加到后缀表达式中)7. 扫描完整个中缀表达式后,将栈中剩余的运算符依次弹出并添加到后缀表达式中8. 后缀表达式即为转换结果例如,将中缀式"3 + 4 * 5"转换为后缀式的过程如下:中缀表达式: 3 + 4 * 5初始化:栈为空,后缀表达式为空扫描 3:后缀表达式:3扫描 +:栈为空,运算符入栈扫描 4:后缀表达式:3 4扫描 *:栈顶运算符优先级低于当前运算符,运算符入栈扫描 5:后缀表达式:3 4 5扫描完毕,将栈中剩余运算符弹出:后缀表达式:3 4 5 * +因此,中缀式"3 + 4 * 5"转化为后缀式"3 4 5 * +"。

将后缀式转换为中缀式可以通过使用栈和逆序扫描后缀表达式的方式来完成。

具体步骤如下:1. 创建一个空栈2. 从左到右逆序扫描后缀表达式的每个元素3. 如果遇到操作数,则将其入栈4. 如果遇到运算符,则从栈中弹出两个操作数,并将运算符与操作数组合成一个中缀表达式,并将该中缀表达式入栈5. 扫描完整个后缀表达式后,栈顶的中缀表达式即为转换结果例如,将后缀式"3 4 5 * +"转换为中缀式的过程如下:后缀表达式:3 4 5 * +初始化:栈为空从右到左逆序扫描:扫描 +:弹出操作数5和4,组合为中缀表达式"4 + 5",入栈扫描 *:弹出操作数4和中缀表达式"4 + 5",组合为中缀表达式"(4 + 5) * 4",入栈扫描 3:入栈扫描完毕,栈顶的中缀表达式即为转换结果:中缀表达式:"(4 + 5) * 3"因此,后缀式"3 4 5 * +"转化为中缀式"(4 + 5) * 3"。

C#算术表达式求值(后缀法),看这一篇就够了

C#算术表达式求值(后缀法),看这一篇就够了

C#算术表达式求值(后缀法),看这⼀篇就够了⼀、种类介绍算术表达式有三种:前缀表达式、中缀表达式和后缀表达式。

⼀般⽤的是中缀,⽐如1+1,前后缀就是把操作符移到前⾯和后⾯,下⾯简单介绍⼀下这三种表达式。

1、前缀表⽰法前缀表⽰法⼜叫波兰表⽰法,他的操作符置于操作数的前⾯(例:+ 1 2),是波兰数学家扬·武卡谢维奇1920年代引⼊的,⽤于简化命题逻辑。

因为我们⼀般认为操作符是在操作数中间的,所以在⽇常⽣活中⽤的不多,但在计算机科学领域占有⼀席之地。

⼀般的表⽰法对计算机来说处理很⿇烦,每个符号都要考虑优先级,还有括号这种会打乱优先级的存在,将使计算机花费⼤量的资源进⾏解析。

⽽前缀表⽰法没有优先级的概念,他是按顺序处理的。

举个例⼦:9-2*3这个式⼦,计算机需要先分析优先级,先乘后减,找到2*3,再进⾏减操作;化成前缀表⽰法就是:- 9 * 2 3,计算机可以依次读取,操作符作⽤于后⼀个操作数,遇到减就是让9减去后⾯的数,⽽跟着9的是乘,也就是说让9减去乘的结果,这对计算机来说很简单,按顺序来就⾏了。

2、中缀表⽰法这也就是我们⼀般的表⽰法,他的操作符置于操作数的中间(例:1 + 2),前⾯也说过这种⽅法不容易被计算机解析,但他符合⼈们的普遍⽤法,许多编程语⾔也就⽤这种⽅法了。

在中缀表⽰法中括号是必须有的,要不然运算顺序会乱掉。

3、后缀表⽰法后缀表⽰法⼜叫逆波兰表⽰法,他的操作符置于操作数的后⾯(例:1 2 +),他和前缀表⽰法都对计算机⽐较友好,但他很容易⽤堆栈解析,所以在计算机中⽤的很多。

他的解释过程⼀般是:操作数⼊栈;遇到操作符时,操作数出栈,求值,将结果⼊栈;当⼀遍后,栈顶就是表达式的值。

因此逆波兰表达式的求值使⽤堆栈结构很容易实现,且能很快求值。

注意:逆波兰记法并不是简单的波兰表达式的反转。

因为对于不满⾜交换律的操作符,它的操作数写法仍然是常规顺序,如,波兰记法/ 6 3的逆波兰记法是6 3 /⽽不是3 6 /;数字的数位写法也是常规顺序。

信息学竞赛前中后缀表达式精讲

信息学竞赛前中后缀表达式精讲

信息学竞赛前中后缀表达式精讲一、前缀表达式前缀表达式,也称为波兰表达式,是一种将运算符置于操作数之前的表示方法。

在前缀表达式中,运算符在操作数之前,且每个运算符和操作数之间都用空格隔开。

例如,"+ 3 4"表示的是3和4的和。

前缀表达式的计算过程是从右到左进行的。

以"+ 3 4"为例,首先是加法运算符"+",后面是两个操作数3和4,所以结果是7。

前缀表达式的优点是可以直接通过栈来计算,不需要考虑运算符的优先级。

具体计算过程是,从右到左遍历表达式,遇到操作数就入栈,遇到运算符就取出栈顶的两个操作数进行运算,再将结果入栈。

最终,栈中的唯一元素就是表达式的结果。

二、中缀表达式中缀表达式是我们常见的数学表达式的表示方式,运算符在操作数的中间,例如"3 + 4"。

中缀表达式的计算过程是从左到右进行的,遇到运算符时需要考虑优先级。

为了解决中缀表达式中运算符优先级的问题,我们可以使用括号来改变运算的顺序。

括号中的表达式优先计算,然后再根据运算符的优先级进行计算。

例如,"(3 + 4) * 5",首先计算括号中的表达式"3 + 4",结果是7,然后再将结果乘以5,最终结果是35。

中缀表达式的计算过程比较复杂,需要考虑运算符的优先级和括号的影响。

一种常见的方法是使用栈和队列来计算中缀表达式。

具体过程是,从左到右遍历表达式,遇到操作数就入队列,遇到运算符则与栈顶的运算符进行比较,如果栈顶的运算符优先级较高,则将栈顶的运算符出栈并入队列,直到栈为空或者栈顶的运算符优先级较低。

然后将当前的运算符入栈。

最终,队列中的唯一元素就是表达式的结果。

三、后缀表达式后缀表达式,也称为逆波兰表达式,是一种将运算符置于操作数之后的表示方法。

在后缀表达式中,运算符在操作数之后,且每个运算符和操作数之间都用空格隔开。

例如,"3 4 +"表示的是3和4的和。

前缀、中缀、后缀表达式的相互转换方法

前缀、中缀、后缀表达式的相互转换方法

前缀、中缀、后缀表达式的相互转换⽅法前缀式、中缀式、后缀式相互转换⼀. 中缀式转化成前缀式和后缀式:⼀个中缀式到其他式⼦的转换⽅法这⾥我给出⼀个中缀表达式a +b *c - (d +e )第⼀步:按照运算符的优先级对所有的运算单位加括号式⼦变成:( ( a + ( b * c ) ) - ( d + e ) )第⼆步:转换前缀与后缀表达式中缀转前缀:把运算符号移动到对应的括号前⾯则变成:- ( + ( a * ( b c ) ) + ( d e ) )把括号去掉:- + a * b c + d e 前缀式⼦出现中缀转后缀:把运算符号移动到对应的括号后⾯则变成:( ( a ( b c ) * ) + ( d e ) + ) -把括号去掉:a b c * + d e + - 后缀式⼦出现⼆. 前缀式转化成中缀式:+ a * b c + d e从后往前遇到运算符,将其与后⾯两个运算数结合,加上括号,当成新的运算数(例如:* b c 加上括号,变成 ( * b c )⼀个整体,作为运算数)变成:( - ( + a ( * b c ) ) ( + d e ) )将运算符加在括号内运算数中间。

变成:( ( a + ( b * c ) ) - ( d + e ) )去掉部分括号:a + b * c - ( d + e )(最后去掉的是不影响运算式含义的多余括号)三. 后缀式转化成中缀式:a b c * + d e + -从前往后遇到运算符,将其与前⾯两个运算数结合,加上括号,当成新的运算数变成:( ( a ( b c * ) + ) ( d e + ) - )将运算符加在括号内运算数中间。

变成:( ( a + ( b * c ) ) - ( d + e ) )去掉部分括号:a + b * c - ( d + e )(最后去掉的是不影响运算式含义的多余括号)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Stack
* ( +
a b c
Outpu t
* + d e
a+b*c+(d*e+f)*g
11. 读到“+”,弹出“*”并输出,然后将“+”压入栈中。 12.读到f,直接输出。 此时栈和输出的情况如下:
Stack
* ( +
a b c * +d e * f
Outpu t
a+b*c+(d*e+f)*g
Stack
++ a * b c * + * d e f g
Outpu t
任务二:将下列中缀表达式转换为前缀表达式
中缀表达式 前表达式
• 1+((2+3)*4)-5 • a-(b + c/d)*e • a + b*(c + d/e) • a*(b + c)-d
•? •? •? •?
思考
中缀表达式到前缀表达式、 后缀表达式是否还有其他的转换 方法?
Stack
* +
a b c
Outpu t
a+b*c+(d*e+f)*g
6.读到“+”,因为栈顶元素“*”优先级比“+”高,所以弹出“*” 并输出,同理,栈中下一个元素“+”优先级与读到的操作符“+”一样, 所以也要弹出并输出。然后再将读到的“+”压入栈中。
此时栈和输出的情况如下:
Stack
+
a b c
前缀表达式的计算机求值举例
前缀表达式“-*+3456” (1)从右至左扫描,将6、5、4、3压入堆栈; (2)遇到+运算符,因此弹出3和4(3为栈顶元素、4为次顶元素), 计算出3+4的值,得7,再将7入栈;
(3)接下来是*运算符,因此弹出7和5,计算出7*5=35,将35入栈;
(4)最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
• *乘法运算符、/除法运算符、%取余运算符 • +加法运算符、-减法运算符 • 左移运算符、右移运算符 • <、<=、>、>=四种关系运算符 • ==等于运算符、!=不等于运算符 两种关系运算符 • &按位运算符
左结合
左结合
左结合 左结合
左结合
9级
• ^按位异或运算符
左结合
10级
• |按位或运算符
当从左到右顺序扫描完整个中缀表达式后,检测运算符栈,如果非空,则依次弹 栈,将弹出的运算符依次压入到后缀表达式中,最终得到中缀表达式对应的后缀表达 式。
转换过程需要用到栈,具体过程如下
如果遇到操作数,我们就直接将其输出。
如果遇到运算符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
如果遇到一个右括号,则将栈元素弹出,将弹出的运算符输出直到遇到左括号为止。 (注意,左括号只弹出并不输出) 如果遇到任何其他的运算符,如(“+”、“*”、“(”)等,从栈中弹出元素直 到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的运 算符压入到栈中。(需要注意,只有遇到“)”的情况下我们才弹出“(”,其他情况 我们都不会弹出“(”。 如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
* +
Stack
g f e d * + * c b
Outpu t
a+b*c+(d*e+f)*g
14.读到“+”,因为栈顶元素“*”优先级比“+”高,因此,弹出 栈顶元素再入栈。
15.读到a,直接输出。
此时栈和输出的情况如下:
+ +
Stack
g f e d * + * c b * a
Outpu t
a+b*c+(d*e+f)*g
后缀表达式的计算机求值
与前缀表达式类似,只是顺序是从左至右,从左至右扫描 表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出 栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈; 重复上述过程直到表达式最右端,最后运算得出的值即为表达 式的结果。
后缀表达式的计算机求值举例
例如 后缀表达式“34+5*6-” (1)从左至右扫描,将3和4压入堆栈; (2)遇到+运算符,因此,弹出4和3(4为栈顶元素、3为次栈顶元素, 注意与前缀表达式做比较),计算3+4的值,得7,再将7入栈; (3)将5入栈;
将中缀表达式转换为前缀表达式
a+b*c+(d*e+f)*g
1.首先读到g,直接输出。
2.读到“*”,将其放入到栈中。 3.读到“)”,因为栈顶元素“*”优先级比“)”低,所以将“)” 直接压入栈中。 此时栈和输出的情况如下:
Stack
) *
g
Outpu t
a+b*c+(d*e+f)*g
4.读到f,直接输出。 5.读到“+”,直接入栈。 6.读到e,直接输出。 此时栈和输出的情况如下:
Outpu t
* +
a+b*c+(d*e+f)*g
7. 下一个读到的为“(”,它优先级最高,所以直接放入到栈中。 8.读到d,将其直接输出。 此时栈和输出的情况如下:
Stack
( +
a b c
Outpu t
* + d
a+b*c+(d*e+f)*g
9. 读到“*”,由于只有遇到“)”的时候,左括号“(”才会弹 出,所以“*”直接压入栈中。 10.读到e,直接输出。 此时栈和输出的情况如下:
双面运算符
运算所需变量为两 个的运算符叫做双目 运算符。
三目运算符
运算所需变量为三 个的运算符叫做三目 运算符。
+、-、*、/、%、,、>=
?:
前缀表达式的计算机求值
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇 到运算符,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈,重复上述过程直到表达式最左端,最后运算得 出的值即为表达式的结果。
(4)接下来是*运算符,因此,弹出5和7,计算出7*5=35,将35入栈;
(5)将6入栈; (6)最后是-运算符,计算出6-35的值,即-29,由此得出最终结果。
新课讲授
1.中缀表达式转后缀表达式的思想、实例、习题
2. 中缀表达式转前缀表达式的思想、实例、习题
一、中缀表达式转后缀表达式
设置一个运算符栈,如果遇到操作数,则直接将操作数放进后缀表达式中,如果 遇到非操作数,则:如果是左括号,则将左括号入栈;如果是右括号,则从运算符中 将运算符弹栈,放入后缀表达式中,直至栈空或遇到栈中的左括号,并将左括号弹栈; 如果是其他运算符,则比较其优先级与栈中运算符优先级情况,如果栈中的运算符的 优先级大于等于当前运算符,则将栈中运算符弹栈,直至栈空,或栈中运算符优先级 小于当前运算符的优先级,将当前运算符压栈。
第二章 前缀表达式、中缀表达 式、后缀表达式的转换
授课教师:邵红蒙
日期:2018年5月3日
课前复习
1.运算符及其优先级和结合性
2.前缀表达式的计算机求值
3.后缀表达式的计算机求值
运算符及其优先级和结合性
运算符的分类:算术运算符、关系运算符、逻辑运算符、 按位运算符。 运算符的级别:15级。从1级到15级优先级逐渐减低,1 级最高、15级最低。 注意:在表达式求值时,当运算符优先级相同时,根据其 结合性依次计算。
乘后赋值运算符 除后赋值运算符 取模后赋值运算符 左移后赋值运算符
«=
»= &=
^= |=
右移后赋值运算符 按位与后赋值运算符
按位异或后赋值运算符 按位或后赋值运算符
单目运算符
运算所需变量为一 个的运算符叫单目运 算符,又叫一元运算 符。
逻辑非运算符、按位取 反运算符、自增自减运算符、 负号运算符、类型转换运算符、 指针运算符和取地址运算符、 长度运算符。
Stack
+ ) *
g
Outpu t
f
e
a+b*c+(d*e+f)*g
7.读到“*”,因为栈顶元素是“+”优先级比“*”低,所以,直接 入栈。
8.读到d,直接输出。
此时栈和输出的情况如下:
Stack
* + ) *
g
Outpu t
f
e
d
a+b*c+(d*e+f)*g
9.读到“(”,将栈中的操作符依次弹栈,直到遇到“)”。 此时栈和输出的情况如下:
实例
a+b*c+(d*e+f)*g
1.首先读到a,直接输出。 2.读到“+”,将其放入到栈中。 3.读到b,直接输出。 此时栈和输出的情况如下:
Stack
+
a
b
Outpu t
a+b*c+(d*e+f)*g
4.读到“*”,因为栈顶元素“+”优先级比“*”低,所以将“*” 直接压入栈中。 5.读到c,直接输出。 此时栈和输出的情况如下:
左结合 右结合 左结合 左结合
1级
2级 3级 4级 5级 6级 7级 8级
• ()圆括号、[
]下标运算符、->指向结构体成员运算符、. 结构体成员运算符
• !逻辑非运算符、~按位取反运算符、++前缀增量运算符、--前缀减量运算符、-负号运算符、 (类型)类型转换运算符、*指针运算符、&地址运算符、size of长度运算符
相关文档
最新文档