栈的应用 中缀表达式 转换为 后缀表达式 和 前缀表达式

表达式举例

中缀表达式 A+(B-C/D)*E

后缀表达式 ABCD/-E*+


中缀表达式与后缀表达式的区别:
  • 运算数的顺序都是相同的
  • 运算符的书写顺序不同,但真正的逻辑计算顺序相同
    将中缀表达式

运算符的优先级
  • 乘法(或除法)、取模运算 最高
  • 加法(减法) 次高
  • 左括号 最低

栈的应用

将中缀表达式转换为后缀表达式的过程需要用到栈,因为当从左到右扫描时不能确定当前运算符的优先级别(没有扫到最右边,还不能预知)

在后缀表达式中,优先级高的以及括号内的运算符出现在前面


中缀表达式转后缀表达式的步骤

(1) 从左到右扫描,遇到数字,判断是否大于0小于9,若是添加到后缀表达式,继续取字符
(2) 遇到乘号(或除号),判断若栈不为空且栈顶取出来的是乘号(或除号),则将栈顶的运算符出栈,若不满足则不将栈顶的运算符出栈。然后当前运算符入栈。
(3) 遇到左括号,直接入栈。
(4) 遇到加号(或减号),判断若栈不为空且栈顶取出来的不是左括号,则出栈运算符,若不满足则不将栈顶的运算符出栈。然后当前运算符入栈。
(5) 遇到右括号,出栈。然后将左括号之前的全部追加到后缀表达式中。


计算后缀表达式的值

(1) 若遇到数字,入栈。
(2) 若遇到运算符,取出栈顶的2个元素


中缀表达式转前缀表达式的步骤

(1) 初始化2个栈:运算符栈S1和存储中间结果的栈S2
(2) 从右到左扫描中缀表达式
(3) 遇到操作数,将其放入S2
(4) 遇到运算符,比较其与S1栈顶运算符的优先级
(4-1)若S1为空,或栈顶运算符为右括号,则直接将此运算符入栈
(4-2)否则,若优先级比栈顶运算符高或相等,也将次运算符入栈
(4-2)否则,将S1栈顶的运算符弹出并压入S2中,然后跳转到(4-1)与S1中新的栈顶运算符进行优先级的比较
(5) 遇到括号时
(5-1)若是右括号,则直接入栈S1
(5-2)若是左括号,依次弹出S1的栈顶运算符并压入S2中,直到遇到右括号为止,此时将这一对括号丢弃
(6) 重复步骤(2)—(5)直到表达式的最左边
(7) 将S1中剩余的运算符依次弹出并压入S2
(8) 依次弹出S2中的元素并输出,此即为中缀表达式对应的前缀表达式


前缀表达式的计算

与后缀表达式类似,从右到左扫描,若遇到运算符,则弹出2个元素进行运算


仅供学习

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值