使用栈数据结构将中缀表达式转换为后缀表达式的 C++ 程序

17 Mar 2025 | 4 分钟阅读

中缀表达式

中缀表达式是一种运算符(+、-、*、/)写在两个操作数之间的表达式。例如,考虑以下表达式

这里我们将运算符 '+' 写在操作数 A 和 B 之间,将运算符 - 写在操作数 C 和 D 之间。

后缀表达式

后缀表达式也包含运算符和操作数。在后缀表达式中,运算符写在操作数之后。它也被称为 逆波兰表示法。例如,考虑以下表达式

使用栈将中缀表达式转换为后缀表达式的算法

以下是将中缀表达式转换为逆波兰表示法的 算法

  1. 初始化栈。
  2. 从左到右扫描中缀表达式中的运算符。
  3. 如果最左边的字符是操作数,则将其设置为后缀字符串的当前输出。
  4. 如果扫描到的字符是运算符且栈为空或包含 '('、')' 符号,则将运算符推入栈中。
  5. 如果扫描到的运算符的优先级高于栈中现有运算符的 优先级,或者栈为空,则将其推入栈中。
  6. 如果扫描到的运算符的优先级低于栈中现有运算符的优先级,则弹出所有栈中的运算符。之后,将扫描到的运算符推入栈中。
  7. 如果扫描到的字符是左括号 '(',则将其推入栈中。
  8. 如果遇到右括号 ')',则弹出栈并打印所有输出字符串字符,直到遇到 '(',并丢弃两个括号。
  9. 重复步骤 2 到 8,直到中缀表达式扫描完毕。
  10. 打印栈输出。
  11. 从栈中弹出并输出所有字符,包括运算符,直到栈为空。

让我们将中缀表达式转换为栈中的后缀表达式

这里,我们有中缀表达式 (( A * (B + D)/E) - F * (G + H / K))) 要转换为等效的后缀表达式

标签编号。扫描到的符号Stack表达
1((
2(((
3A((A
4*((*A
5(((*(A
6B((*(AB
7+((*(+AB
8D((*(+ABD
9)((*ABD+
10/((*/ABD+
11E((*/ABD+E
12)(ABD+E/*
13-(-ABD+E/*
14((-(ABD+E/*
15F(-(ABD+E/*F
16*(-(*ABD+E/*F
17((-(*(ABD+E/*F
18G(-(*(ABD+E/*FG
19+(-(*(+ABD+E/*FG
20H(-(*(+ABD+E/*FGH
21/(-(*(+/ABD+E/*FGH
22K(-(*(+/ABD+E/*FGHK
23)(-(*ABD+E/*FGHK/+
24)(-ABD+E/*FGHK/+*
25)ABD+E/*FGHK/+*-

将中缀表达式转换为后缀表达式的程序

让我们创建一个 C++ 程序,将中缀表达式转换为后缀表达式

输出

Program to convert infix to postfix expression in C++ using the Stack Data Structure