【数据结构】栈的应用-将中缀表达式转化为后缀表达式

1、后缀表达式简介

后缀表达式即逆波兰式,是波兰逻辑学家卢卡西维奇(Lukasiewicz)于1929年发明的一种表示表达式的方法。区别于我们常用的中缀表达式(如2+3*5),后缀表达式是将每个运算符放到操作数之后,没有优先级和括号,例如2 3 5 * + 。

2、中缀表达式转后缀达式的方法

定义一个栈S,存储运算符和操作数。

1、如果检测到操作数,直接加入后缀表达式。

2、如果检测到运算符:

a、如果栈S为空或者运算符为"("或者栈顶运算符为"(",直接加入栈中;

b、如果是"(",则依次将栈中运算符弹出加入到后缀表达式中,直到遇到"("停止,并删除"("。

c、如果是"+"、"-"、"*"、"/"运算符:

  • 如果栈S为空或者顶运算符为"(",直接加入栈中;
  • 如果当前运算符优先级高于栈顶运算符,则直接入栈;
  • 否则,依次弹出栈顶运算符加入后缀表达式,直到栈顶运算符低于当前运算符或者栈为空或者遇到一个"(",然后将它入栈。

3、遍历完整个中缀表达式后,如果栈非空,则依次弹出加入后缀表达式。

注:后缀表达式不包含括号。

3、举例

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

  1. 遇到操作数A加入后缀表达式。此时后缀表达式内容(A)。栈为空。​​
  2. 遇到"+",栈顶为空,直接入栈。此时后缀表达式为(A)。                                              
  3. 遇到B,直接加入后缀表达式。此时后缀表达式为(A B)。                                       
  4. 遇到"*",优先级高于栈顶元素"-",直接入栈。此时后缀表达式为(A B)。                 
  5. 遇到"(",直接入栈。此时后缀表达式为(A B)。                                                        
  6. 遇到C,加入后缀表达式。此时后缀表达式为(A B C)。                       ​​​​​​​                        
  7. 遇到"-",因为栈顶为"(",所以直接入栈。此时后缀表达式为(A B C)。        ​​​​​​​                 
  8. 遇到D,加入后缀表达式。此时后缀表达式为(A B C D)。                      ​​​​​​​                       
  9. 遇到")",依次弹出栈顶元素,直到遇到"(",并删除"("。此时后缀表达式为(A B C D -)。    
  10. 遇到”/",优先级并不大于栈顶运算符"*",故弹出"*",遇到"-",优先级小于它,则终止,将"/"入栈。此时后缀表达式为(A B C D - * )。                                                                  
                                                              ​​​​​​​                    ​​​​​​​                          ​​​​​​​      ​​​​​​​         
  11. 此后类似,不再列举,直到遍历完整个中缀表达式。此时后缀表达式为(A B C D - * E / + F H ),而非空。                                                                                                       ​​​​​​​  ​​​​​​​        
  12. 依次弹出栈中元素加入后缀表达式,得到最终的后缀表达为(A B C D - * E / + F H / +)。

完结撒花~~~如果对您有帮助,还请多多支持哦,谢谢!

中缀表达式后缀表达式(也称为逆波兰表示法,Reverse Polish Notation,RPN),可以通过数据结构来完成。以下是简单的C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义运算符优先级 #define PRECEDENCE(op) ((op)=='+' || (op)=='-' ? 1 : ((op)=='*' || (op)=='/' ? 2 : 0)) void infixToRPN(char* input, char* output) { stack<int> s; int i = 0; while (input[i] != '\0') { if (isalnum(input[i])) { // 遇到数字,直接放入output output[strlen(output)] = input[i]; output[strlen(output) + 1] = '\0'; i++; } else if (input[i] == '(') { // 遇到左括号,入 s.push(i); } else if (input[i] == ')') { // 遇到右括号,直到左括号出 while (!s.empty() && input[s.top()] != '(') output[strlen(output)] = input[s.pop()]; s.pop(); // 出左括号 } else { // 遇到操作符 while (!s.empty() && precedence(input[i]) <= precedence(input[s.top()])) { output[strlen(output)] = input[s.pop()]; } s.push(i); } i++; } // 把剩余的操作符依次压入结果 while (!s.empty()) { output[strlen(output)] = input[s.pop()]; } } int main() { char input[] = "A+B*C-(D+E)"; char output[100]; infixToRPN(input, output); printf("Infix expression: %s\n", input); printf("Postfix expression: %s\n", output); return 0; } ``` 这段代码首先定义了一个,遍历输入的中缀表达式。遇到数字直接加入输出,遇到左括号就入,遇到右括号则将左括号与之对应的运算符全部出。最后,把剩余的操作符依次压入结果。 运行这段代码会得到从给定的中缀表达式转换成的后缀表达式
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Xiao.Yi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值