中缀表达式转后缀表达式

1 后缀式简介

  一种不需要括号的后缀表达法,也把它称为 逆波兰表示,是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法。

2 由中缀表达式求后缀表达式示例(3种方法)

  中缀表达式指的是“9+(3-1)×3+8÷2”,这种就是我们通常见到的书写算式顺序,要计算中缀表达式则首先要将字符串转换为后缀表达式,即9 3 1 - 3 * + 8 2 / +,以下均是对于“9+(3-1)×3+8÷2”算式求解后缀表达式的方法。

2.1 方法一:栈的应用-四则运算表达式求值

2.1.1 栈的应用-四则运算表达式求值规则

  1.设定运算符栈;
  2.从左到右遍历中缀表达式的每个数字和运算符;
  3.若当前字符是数字,则直接输出成为后缀表达式的一部分;
  4.若当前字符为运算符,则判断其与栈顶运算符的优先级,若优先级大于栈顶运算符,则进栈;若优先级小于等于栈顶运算符,退出栈顶运算符成为后缀表达式的一部分,然后将当前运算符放入栈中;
  5.若当前字符为“(”,进栈;
  6.若当前字符为“)”,则从栈顶起,依次将栈中运算符出栈成为后缀表达式的一部分,直到碰到“(”。将栈中“(”出栈,不需要成为后缀表达式的一部分,然后继续扫描表达式直到最终输出后缀表达式为止。

2.1.2 栈的应用-四则运算表达式求值示例

  1、初始化一个空栈。此栈用来对运算符进出栈使用。如图2-1-2-1的左图所示。
  2、第一个字符是数字9,直接输出9(根据规则3),第二个字符是运算符“+”,则“+”进栈(根据规则4),如图2-1-2-1的右图所示。
在这里插入图片描述

图2-1-2-1
  3、第三个字符是符号“(”,则“(”进栈(根据规则5),如图2-1-2-2左图所示。

  4、第四个字符是数字3,直接输出3(根据规则3),总输出表达式为

    9 3

  第五个字符是运算符“-”,则“-”进栈(根据规则4),第六个字符是数字1,直接输出1(根据规则3),总输出表达式为

    9 3 1

  如图2-1-2-2右图所示。

在这里插入图片描述

图2-1-2-2
  5、第七个字符是符号“)”,此时依次将栈中运算符出栈成为后缀表达式的一部分,直到碰到"(",此时“(”上方只有“-”运算符,因此输出“-”运算符(根据规则6),总输出表达式为
    9 3 1 -

  如图2-1-2-3左图所示。

  6、第八个字符是运算符“ * ”,因为此时的栈顶符号是运算符“+”,优先级低于“ * ”,因此不输出,“ * ”进栈(根据规则4),如图2-1-2-3右图所示。

在这里插入图片描述

图2-1-2-3

  第九个字符是数字3,直接输出3(根据规则3),总输出表达式为

    9 3 1 - 3

  7、第十个符号是运算符“+”,此时栈顶符号是“*”,比“+”运算符的优先级高。因此栈中元素出栈并成为后缀表达式的一部分(没有比“+”运算符更低的优先级,所以全部出栈),总输出表达式为

    9 3 1 - 3 * +

  后把第十个符号“+”进栈(根据规则4)。
  之前输出成为后缀表达式的“+”是中缀表达式中“9 + ”的“+”,现在入栈的“+”是中缀表达式中“9 + (3 - 1) × 3 +”的“+”。如图2-1-2-4左图所示。

  8、第十一个符号是数字8,直接输出8(根据规则3),总输出表达式为

    9 3 1 - 3 * + 8

  第十二个符号是运算符“÷”,则“/”进栈(根据规则4),如图2-1-2-4右图所示。

在这里插入图片描述

图2-1-2-4
  9、第十三个字符也就是最后一个字符是数字2,直接输出2(根据规则3),总输出表达式为
    9 3 1 - 3 * + 8 2

  如图2-1-2-5左图所示。

  10、因为已经到了最后一个字符,所以将栈中符号全部出栈成为后缀表达式的一部分,最终输出表达式为

    9 3 1 - 3 * + 8 2 / +

  如图2-1-2-5右图所示。

在这里插入图片描述

图2-1-2-5
  整个过程,都充分利用了栈的后进先出特性来处理。

  ------以上过程参考《大话数据结构》中“栈的应用-四则运算表达式求值”内容。

2.2 方法二:二叉树应用

2.2.1 二叉树应用规则

  后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历、后序周游,可记做左右根。后序遍历有递归算法和非递归算法两种。在二叉树中,先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点。
------粘百度百科

2.2.2 二叉树应用示例

  直接根据表达式转换画二叉树(画二叉树过程不在描述),如图2-2-2-1所示,之后进行后序遍历便可得到后缀表达式。
在这里插入图片描述

图2-2-2-1
  最后输出后缀表达式为:  
    9 3 1 - 3 * + 8 2 / +

2.3 方法三:加括号法

2.3.1 加括号法规则

  1、根据运算符的优先级对中缀表达式加括号(有几个运算符就有几对括号,原有的括号不用加)
  2、将运算符移到对应括号后面
  3、去掉所有括号,即为后缀表达式
  ------粘百度百科

2.3.2 加括号法示例

  中缀表达式为“9+(3-1)×3+8÷2”

    1、变为((9+((3-1)×3))+(8÷2)2、变为((9((31)-3)*)+(82)/+
    3、得到9 3 1 - 3 * + 8 2 / +

  最后输出后缀表达式为

    9 3 1 - 3 * + 8 2 / +
中缀表达式后缀表达式是一种常用的算法问题。中缀表达式是我们常见的数学表达式形式,例如(3 + 4) * 5 - 6,而后缀表达式(也叫逆波兰表达式)则是将操作符放在操作数之后的表达式形式,例如3 4 + 5 * 6 -。 进行中缀表达式后缀表达式的算法可以使用栈来实现。具体步骤如下: 1. 创建一个空栈和一个空列表,用于存储操作符和最终的后缀表达式; 2. 从左到右遍历中缀表达式的每个字符; 3. 如果当前字符是数字或字母,则将其添加到后缀表达式的列表中; 4. 如果当前字符是左括号,则将其压入栈中; 5. 如果当前字符是右括号,则将栈中的操作符依次弹出并添加到后缀表达式的列表中,直到遇到左括号为止; 6. 如果当前字符是操作符,则判断栈顶操作符的优先级,如果栈顶操作符的优先级高于等于当前操作符,则将栈顶操作符弹出并添加到后缀表达式的列表中,重复这一步骤直到栈顶操作符的优先级低于当前操作符或栈为空,最后将当前操作符压入栈中; 7. 遍历完中缀表达式后,将栈中的操作符依次弹出并添加到后缀表达式的列表中; 8. 最终得到的列表即为换后的后缀表达式。 以中缀表达式(3 + 4) * 5 - 6为例,按照上述算法进行换得到后缀表达式3 4 + 5 * 6 -。 通过这个算法,我们可以将中缀表达式换为后缀表达式,这种形式更适合计算机进行解析和计算。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAZHR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值