表达式求值时对数据结构中栈结构的灵活应用,对于一个表达式而言,它由操作数和运算符组合而成,我们现实中常见的表达式:A+B-C,类似这种格式的我们称之为中缀表达式,但是,计算机的计算方式是有别于人的,所以,我们可以先将表达式转换为后缀表达式,再对后缀表达式进行计算,这个过程就是我们常用的表达式求解的过程。
首先,我们要解决的问题是如何将中缀表达式转换成后缀表达式。下面是相关算法:
遍历表达式,
① 从左向右依次取得字符ch并进行判断
②如果ch为操作数,则直接将该操作数拼接到后缀表达式output中(初始状态为"")。
③如果ch为运算符,则进行以下操作:
a、如果data='(',直接将'('入运算符栈。
b、如果data=')',依次弹出运算符栈中的栈顶元素,知道弹出'('为止。
c、如果不是a、b两种情况,则将ch与栈顶元素比较优先级
如果ch优先级高,或者栈为空,那么直接将ch入栈
否则,先将栈顶元素弹到output上,再将ch入栈
④如果,字符串遍历结束后,运算符栈不为空,则依次将栈顶元素弹出到output上。
实例 a+b-c
读取a,为操作数,output=a
读取+,为运算符,属于情况c,直接入栈
读取b,为操作数,output=ab
读取-,为运算符,属于情况c,将栈顶元素弹出,再将-压栈,output=ab+
读取c,为操作数,output=ab+c
遍历结束,栈不为空,依次弹出
output=ab+c-
当表达式转换成后缀表达时,计算将变得非常简单,下面是计算后缀表达式的算法:
1,设置一个栈用于存储操作数,栈初始化为空,然后从左到右扫描后缀表达式。
2,若ch为操作数,则进栈
若ch为运算符,则从栈中退出两个元素,先退出的放到运算符的左边,后弹出的放到运算符的右边,进行计算,并将运算结果压入栈中。
3,直到后缀表达式扫描结束,此时栈中只剩下一个元素,即为运算结果。
程序源码如下:
csdn链接:https://blog.csdn.net/Taylar_where/article/details/81281529