前缀表达式、中缀表达式、后缀表达式总结

一、前缀表达式

(1)定义

前缀表达式是一种没有括号的算术表达式,其将运算符写在前面,操作数写在后面。例如表达式1-(2+3)的前缀表达式是- 1 + 2 3。


(2)求值方法

对前缀表达式求值,要从右至左扫描表达式,首先从右边第一个字符开始判断,若当前字符是数字则一直到数字串的末尾再记录下来,若为运算符,则将右边离得最近的两个“数字串”作相应运算,然后以此作为一个新的“数字串”并记录下来;扫描到表达式最左端时扫描结束,最后运算的值即为表达式的值。

例如:对前缀表达式“- 1 + 2 3”求值,扫描到3时,记录下这个数字串,扫描到2时,记录下这个数字串,当扫描到+时,将+右移做相邻两数字串的运算符,记为2+3,结果为5,记录下5这个新数字串,然后继续向左扫描,扫描到1时,记录下这个数字串,扫描到-时,将-右移做相邻两数字串的运算符,记为1-5,结果为-4,此时关于这个表达式的全部运算已完成,故表达式的值为-4。


(3)中缀表达式转化为前缀表达式

方法:从右往左扫描


例子:将中缀表达式“1+((2+3)*4)-5”转换为前缀表达式:

中缀表达式

前缀表达式

(栈顶)运算符栈(栈尾)

说明

5

5

5,是数字串直接输出

-

5

-

-,栈内无运算符,直接入栈

)

5

-)

),直接入栈

4

5 4

-)

4,是数字串直接输出

*

5 4

-)*

*,栈顶是括号,直接入栈

)

5 4

-)*)

),直接入栈

3

5 4 3

-)*)

3,是数字串直接输出

+

5 4 3

-)*)+

+,栈顶是括号,直接入栈

2

5 4 3 2

-)*)+

2,是数字串直接输出

(

5 4 3 2 +

-)*

(,与栈里最后一个)抵消,并释放它们之间的+

(

5 4 3 2 + *

-

(,方法与上类同,请参考下一目录

+

5 4 3 2 + *

-+

+,优先级大于等于栈顶运算符,直接入栈

1

5 4 3 2 + * 1

-+

1,是数字串直接输出

5 4 3 2 + * 1 + -

扫描结束,将栈内剩余运算符全部出栈并输出

- + 1 * + 2 3 4 5

逆缀输出字符串


二、中缀表达式
 

(1)定义

是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3+4),中缀表达式是人们常用的算术表示方法。

 

(2)中缀表达式“8+4-6*2”用后缀表达式表示为:8 4 + 6 2 * -

 

(3)中缀表达式“2*(3+5)+7/1-4”用后缀表达式表示为:3 5 + 2 * 7 1 /4 - +


三、后缀表达式

(1)定义

不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不在考虑运算符的优先规则),如:(2+1)*3,即2 1 + 3 *


(2)中缀表达式转换为后缀表达式

思想:

开始扫描(从左往右);

数字时,加入后缀表达式;

运算符:

a. 若为’(‘,入栈

b. 若为’)’,则依次把栈中的运算符加入后缀表达式中,直到出现’(‘,从栈中删除’(‘;

c. 若为除括号外的其他运算符,当其优先级高于除’(‘以外的栈顶运算符时,直接入栈。否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号为止。

 

例子,将中缀表达式“1+((2+3)*4)-5”转换为后缀表达式的过程如下:

中缀表达式

后缀表达式

(栈顶)运算符栈(栈尾)

说明

1

1

数字直接入栈

+

1

+

栈为空,直接入栈

(

1

+ (

左括号,直接入栈

(

1

+ ( (

左括号,直接入栈

2

1 2

+ ( (

数字直接入栈

+

1 2

+ ( ( +

栈顶为左括号,运算符直接入栈

3

1 2 3

+ ( ( +

数字直接入栈

)

1 2 3 +

+ (

右括号,弹出运算符直至遇到左括号

*

1 2 3 +

+ ( *

栈顶是左括号,运算符直接入栈

4

1 2 3 + 4

+ ( *

数字直接入栈

)

1 2 3 + 4 *

+

右括号,弹出运算符直至遇到左括号

-

1 2 3 + 4 * +

-

-与+优先级相同,因此弹出+,再压入-

5

1 2 3 + 4 * +  5

-

数字直接入栈

1 2 3 + 4 * +  5 -

剩余的运算符


因此结果为“1 2 3 + 4 * + 5 -”
 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值