栈应用2(中缀表达式转换成后缀表达式)-笔记

问题:如何使用栈来实现将中缀转换为后缀表达式的算法?
解答:在讨论算法前,首先介绍中缀、前缀和后缀表达式的定义
中缀:中缀表达式由一个单一字符或运算符,连接前后两个中缀字符串共同组成。
A
A+B
(A+B)+(C+D)
前缀:前缀表达式由一个单一字符或运算符,随后是两个前缀字符串共同组成。每个前缀字符串长度大于1,包含一个运算符、第一个操作数和第二个操作数。
A
+AB
++AB-CD
后缀:后缀表达式(逆波兰表达式)由两个后缀字符串,随后是一个单一字符或运算符共同组成。每个后缀字符串长度大于1,包含第一个操作数和第二个操作数,随后是一个运算符。
A
AB+
AB+CD-+
前缀和后缀表达式是无需括号描述数学表达式的方法。计算后缀和前缀表达式的时间开销是O(n),n是数组中元素的个数。

下表给出了运算符之间的优先级和相关性(计算的先后顺序)
在这里插入图片描述
重要性质
a.仔细比较中缀表达式2+3*4和后缀表达式2 3 4 + *,可以发现两种表达式中数字(操作数)的次序是相同的,都是2 3 4。但是运算符 *和(+)的次序在两个表达式中是不同的。
b.只需一个栈就可以把中缀表达式转换成后缀表达式。利用栈把表达式中运算符的次序从中序改编成后序。栈中仅存储运算符和左括号‘(’。由于后缀表达式中不包含括号,所以输出后缀表达式时将不输出括号。
算法:
a.创建一个栈
b.for(输入字符串中的每个字符t){
if(t 是一个操作数)输出t
else if(t 是一个有括号)
}
出栈并输出该符号,直至一个左括号出栈(但左括号不输出)
else //t 是一个运算符或左括号{
出栈并输出该符号,直至出现一个比t的优先级小的符号,或者出现一个左括号,或者栈空
t入栈
}
}
c.出栈并输出该符号,直至栈空

为了更好地理解上述转换算法,给出表达式A*B-(C+D)+E的具体执行过程
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40636998/article/details/85290689