四则表达式实现原理

首先是将中缀表达式转化为后缀表达式:

在计算机中计算一个后缀表达式的值要比计算一个中缀表达式的值简单的多

实现转换的基本步骤如下:

1.初始化一个运算符栈。

2.从算数表达式输入的字符串中依次从左向右每次读取一个字符。

3.如果当前字符是操作数,则直接填写到后缀表达式。

4.如果当前字符是(左括号,将其压入运算符栈(第一步定义)。

5.如果当前字符为运算符,则分两种情况:

          .当运算符栈为空,将其压入运算符栈。

          .当此运算符的优先级大于栈顶元素的时候),则将此运算符压入运算符栈;否则,弹出栈顶运算符到后缀表达式,反复弹出,直到该运算符优先级大于栈顶元素或者栈为空时,然后将当前运算符压栈。回到步骤2继续读取.

6.如果当前字符是)右括号,反复将栈顶元素弹出到后缀表达式,直到栈顶元素是左括号(为止,并将左括号从栈中弹出丢弃。

7.如果读取还未完成,回到步骤2.

8.如果读取完成,则将栈中剩余的运算符依次弹出到后缀表达式。

举个例子:

a+b*c-(d+e)

1.读取到操作数 a,将其放入最终后缀表达式,此时表达式为:a , 栈为空

2.读取到运算符 +,此时栈为空,+ 入栈,此时表达式为:a , 栈为:+

3.读取到操作数 b, 将其放入最终后缀表达式,此时表达式为:ab , 栈为: +

4.读取到运算符 *, 栈不为空,* 优先级大于栈顶元素 + ,* 入栈,此时表达式为:ab , 栈为: +*

5.读取到操作数 c, 将其放入最终后缀表达式,此时表达式为:abc , 栈为: +*

6.读取到运算符 -,栈不为空, - 优先级小于栈顶元素 *,* 出栈,此时表达式为:abc* , 栈为: +,  

                            -优先级等于栈顶元素 +, + 出栈,此时表达式为:abc*+ , 栈为: 空 

                            栈为空,所以 - 入栈,此时表达式为:abc*+ , 栈为: -

7.读取到运算符( , ( 直接入栈,此时表达式为:abc*+ , 栈为: -(

8.读取到操作数 d,将其放入最终后缀表达式,此时表达式为:abc*+d , 栈为: -(

9.读取到运算符 +,+ 优先级大于 (  , + 入栈,此时表达式为:abc*+d , 栈为: -(+

10.读取到操作数 e,将其放入最终后缀表达式,此时表达式为:abc*+de , 栈为: -(+

11.读取到运算符 ),栈顶元素为 +,出栈 ,此时表达式为:abc*+de+ , 栈为: -(

                                 栈顶元素为( ,出栈, 此时表达式为:abc*+de+ , 栈为: -

12,此时表达式已经遍历完毕,按顺序出栈,栈顶元素为 - ,出栈,此时表达式为:abc*+de+- , 栈为: 空

结束。


后缀表达式求值:

从左到右读取
1、设置一个栈,开始时,栈为空;
2、然后从左到右扫描后缀表达式,若遇操作数,则进栈;
3、若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕;
4、最后,栈中仅有一个元素,即为运算的结果。

猜你喜欢

转载自blog.csdn.net/F_hawk189/article/details/81518101
今日推荐