四则表达式实现原理

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

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

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

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、最后,栈中仅有一个元素,即为运算的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值