【数据结构】利用栈中缀表达式转后缀表达式

前提优先级:
其一: *、/、% > +、-
其二:当栈内和栈外操作符等级相同时,默认栈内优先级较高
其三:括号的优先级:左括号 ’ ( ’ 入栈前优先级贼高,入栈后贼低。右括号’)'一经遍历就将栈内与其对应的‘(’到栈顶的操作符全部出栈并输出非括号的操作符。

转换规则如下:(一般会先给操作符栈中入栈一个’#‘,这里就不入了)
1.对中缀表达式从前往后遍历
2.当遍历到操作数时直接输出
3.当遍历到操作符时,遵循如下规律
i)当所遍历到的操作符优先级比栈顶操作符优先级高时,直接将当前遍历到的操作符入栈,否则将栈顶操作符出栈输出,并继续比较。
ii)当遍历到操作符’(‘时,直接入栈,当遍历到’)‘时,将栈顶操作符至栈内最上的’('之间全部操作符出栈并输出非括号的操作符。

实例如下:

将中缀表达式:A+B*(C-D)-E/F 转换
1.遍历到A,直接输出。输出内容:A ; 栈中内容:空
2.遍历到+,入栈。输出内容:A;栈中内容:+;
3.遍历到B,直接输出。输出内容:AB;栈中内容:+;
4.遍历到(,直接入栈。输出内容:AB;栈中内容:+、(;
5.遍历到C,直接输出。输出内容:ABC;栈中内容:+、(;
6遍历到 -,比较 - 与栈顶符号即(,此时 -优先级较高,直接入栈。输出内容:ABC;栈中内容: +、(、-;
7.遍历到D,直接输出。输出内容:ABCD;栈内内容: +、(、-;
8.遍历到 ),把栈中最近的( 到栈顶的操作符全部输出。输出内容:ABCD-;栈中内容:+;
9.遍历到 -,比较 -与栈顶 +,+优先级较高,出栈并输出+,继续比较发现栈底了直接入栈 -,输出内容:ABCD-+;栈中内容: - ;
10.遍历到E,直接输出。输出内容:ABCD-+E;栈中内容: - ;
11.遍历到/,比较 / 与栈顶操作符 - ,/优先级较高,直接入栈。输出内容:ABCD-+E;栈中内容: - 、/;
12.遍历到F,直接输出。输出内容:ABCD-+EF;栈中内容: - 、/;
13.遍历结束,依次将栈中剩余操作符输出。输出内容:ABCD-+EF/-;栈中内容: 空。
输出的内容也就是对应的后缀表达式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中缀表达式转后缀表达式的过程可以使用来实现。下面是实现该换的算法: 1. 创建一个空和一个空字符串,用于存储后缀表达式。 2. 从左到右遍历中缀表达式的每个字符: - 如果字符是数字或字母,直接将其添加到后缀表达式字符串中。 - 如果字符是左括号"(",将其入。 - 如果字符是右括号")",则将顶元素出并添加到后缀表达式字符串,直到遇到左括号为止。左括号不添加到后缀表达式中,也不入。 - 如果字符是运算符(如"+", "-", "*", "/"等): - 如果为空,或者顶元素是左括号"(",则将该运算符入。 - 否则,将顶运算符与当前运算符进行比较: - 如果顶运算符的优先级大于等于当前运算符,则将顶运算符出并添加到后缀表达式字符串中,循环执行该步骤直到不满足条件。 - 将当前运算符入。 3. 遍历完中缀表达式后,将中剩余的所有运算符依次出并添加到后缀表达式字符串中。 4. 后缀表达式字符串即为换后的结果。 以下是一个示例的实现(使用Python语言): ```python def infix_to_postfix(expression): # 定义运算符优先级 precedence = {"+": 1, "-": 1, "*": 2, "/": 2} stack = [] postfix = "" for char in expression: if char.isalnum(): postfix += char elif char == "(": stack.append(char) elif char == ")": while stack and stack[-1] != "(": postfix += stack.pop() stack.pop() # 弹出左括号 else: while stack and stack[-1] != "(" and precedence[char] <= precedence.get(stack[-1], 0): postfix += stack.pop() stack.append(char) while stack: postfix += stack.pop() return postfix ``` 可以通过调用 `infix_to_postfix` 函数将中缀表达式换为后缀表达式。例如,`infix_to_postfix("3+4*2/(1-5)^2^3")` 将返回后缀表达式字符串 "342*15-23^^/"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值