堆栈的应用--计算机对运算表达式编译

        在源程序的表达式中,常出现这样的形式:A*B+C/D,这种形式便于我们理解,但是由于加入了运算符优先级,运算的最终顺序不是按照从左至右,因而不便于计算机的理解。这个时候运用堆栈可以较好地完成这个任务。


在编译系统中对一个中缀表达式进行计算前,总是先将中缀表达式转换为后缀表达式。

例如:A*B+C/D --> AB*CD+/

在堆栈里面,变换方法为:

1、首先建立两个栈,一个为操作数栈(DS),一个为运算符栈(OS)。

2、从左到右扫描表达式,遇到操作数,直接放入DS;遇到运算符,将其与OS里面的栈顶元素进行优先级比较,大于则压入栈,否则退栈。

退栈后以,将OS里的顶元素弹出与DS里的最顶两个数进行运算,结果压入DS,然后才将扫到符号压入栈。

3、扫描结束后,两个操作数与一个运算符一组运算并将运算结果压入DS,直到OS为空。DS里面的元素即为最终结果。


扫描开始,AB送入DS,*符号压入OS栈。

DS                  OS
  
  
B
A*

继续扫描,遇到+符号,优先级低于*符号,因此+不入栈。运算X1=A*B,压入DS栈,+压入OS栈。

DS                  OS
  
  
  
X1+

继续扫描,C压入DS栈,/符号优先级高于+符号,直接压入OS栈,D压入DS栈。

DS                   OS
  
D
C/
X1+

扫描结束,开始依次弹出栈运算,每次运算后将新结果压入栈。运算X2=C/D,压入DS栈。

DS                    OS
  
  
X2
X1+

运算X3=X1+X2,压入DS栈。

DS                   OS
  
  
  
X3 

运算完毕,X3即为最终结果。


通过以上流程,不难看出在系统中这个表达式的最终形式为AB*CD+/。

一个堆栈的实际应用,可以让数据结构的学习不再那么枯燥。


(完)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值