前缀表达式&后缀表达式

  • 前缀表达式(又称波兰式),其特点是运算符在前边,运算数在后边;
  • 后缀表达式(又称逆波兰式),其特点是运算数在前边,运算符在后边;
  • 中缀表达式,一种直观的,便于人看的表达式。

    对于中缀表达式计算时,先算括号里的,然后算乘除,最后算加减。我们先判断其优先级再进行计算,但对于计算机来说,从左至右遍历表达式,处理中缀表达式并不方便。以“X=A+B*(C-D)/E”为例,介绍中缀---->前缀和中缀---->后缀。

中缀—->前缀

  1. 初始化2个栈s1和s2,s1存放运算数,s2存放运算符;
  2. 从表达式右边开始,遍历表达式;
  3. 遇到运算数放入s1中,遇到运算符放入s2中,具体规则如下:
    3-1 如果s2是空或者“)”,直接放进去;
    3-2 如果s2不是空或者不是“)”,当前运算符和栈顶运算符进行比较:

    • 如果当前运算符优先级大于等于栈顶运算符,直接放进去;
    • 如果当前运算符优先级 小于 栈顶运算符,将栈顶运算符取出来放入s1中,重复3-2;
      3-3 遇到“(”,运算符出s2,入s1,直到遇到“)”,丢弃掉“()”,重复3-2、3-3;
  4. s2依次出栈,放入s1栈;

  5. s1出栈重新组成表达式,即前缀表达式。

前缀

  1. 从右到左遍历表达式,E放入s1,/放入s2,)放入s2,D放入s1,-放入s2,C 放入s1;(放入s2,C放入s1,- 放入s2,D放入s1
  2. 遇到 (,将 - 放入s1,丢掉();
  3. “ * ”的优先级等于/,将*放入s2,B放入s1;
  4. +的优先级低于* 和 /,将* / 放入s1,+放入s2;
  5. A放入s1,=的优先级低于+,将+放入s1,再将=放入s2,X放入s1;
  6. s2入s1,s1出栈重新组成表达式,即前缀表达式,=X+A/*B-CDE。

中缀—->后缀

  1. 初始化2个栈s1和s2,s1存放运算数,s2存放运算符;
  2. 从表达式左边开始,遍历表达式;
  3. 遇到运算数放入s1中,遇到运算符放入s2中,具体规则如下:
    3-1 如果s2是空或者“()”,直接放进去;
    3-2 如果s2不是空或者不是“)”,当前运算符和栈顶运算符进行比较:
    • 如果当前运算符优先级 大于 栈顶运算符,直接放进去;
    • 如果当前运算符优先级小于等于栈顶运算符,将栈顶运算符取出来放入s1中;
      3-3 遇到“)”运算符出s2,入s1,直到遇到“(”,丢弃掉“()”,重复3-2、3-3;
  4. s1依次出栈,放入s2栈;
  5. s2出栈重新组成表达式,即后缀表达式。

具体例子如下所示:
图1

图2

  1. 从左到右遍历表达式,X放入s1,=放入s2,A放入s1,+放入s2,B放入s1,* 放入s2,(放入s2,C放入s1,- 放入s2,D放入s1;
  2. 遇到 ) ,将 - 放入s1,丢掉();
  3. / 的优先级等于,将放入s1,再将 / 放入s2;
  4. E放入s2;
  5. s1入s2,s2出栈重新组成表达式,即后缀表达式,XABCD-*E/+=。

做选择题时有一种简单的方法:根据计算的优先顺序加括号,变成后缀表达式将所有的运算符移到对应的括号后边;变成前缀表达式将所有的运算符移到对应的括号前边。以变成后缀表达式为例具体步骤如下:
这里写图片描述

  • 12
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值