表达式求值和括号匹配
表达式求值
表达式求值是计算机科学中的一个基本问题,涉及将数学表达式转换为计算机可以理解和处理的形式。通常,我们使用栈来辅助求值过程,特别是在处理中缀表达式转后缀表达式和后缀表达式求值时。
中缀表达式转后缀表达式
中缀表达式(如a + b * c)是我们通常书写数学表达式的形式。为了方便计算机处理,我们将其转换为后缀表达式(逆波兰表达式,RPN)。转换过程如下:
- 扫描中缀表达式的每个字符。
- 遇到操作数,直接输出。
- 遇到左括号,压入栈。
- 遇到右括号,不断弹出栈顶元素直到左括号。
- 遇到运算符,若其优先级高于栈顶运算符,压入栈,否则不断弹出栈顶运算符直到栈为空或当前运算符的优先级高于栈顶运算符,再将当前运算符压入栈。
后缀表达式求值
后缀表达式(如abc*+)的求值过程如下:
- 扫描后缀表达式的每个字符。
- 遇到操作数,压入栈。
- 遇到运算符,弹出栈顶两个操作数,进行相应运算,并将结果压入栈。
- 最终栈顶元素即为表达式的结果。
括号匹配
括号匹配是验证括号在表达式中是否成对出现和正确嵌套的过程。常见的括号有圆括号()、方括号[]和花括号{}。匹配过程通常使用栈实现:
- 扫描输入字符串,遇到左括号压入栈。
- 遇到右括号,检查栈顶元素是否为对应的左括号,若是则弹出栈顶元素,否则匹配失败。
- 最后栈为空则匹配成功,否则匹配失败。
实际题目及解答
题目1:中缀表达式转后缀表达式
将中缀表达式 a + b * (c - d) 转换为后缀表达式。
解答:
- a:输出- a
- +:压栈- +
- b:输出- b
- *:压栈- *
- (:压栈- (
- c:输出- c
- -:压栈- -
- d:输出- d
- ):弹出栈顶元素- -输出,再弹出栈顶元素- (
- 弹出栈顶元素 *输出
- 弹出栈顶元素 +输出
最终后缀表达式为:ab c d - * +
题目2:后缀表达式求值
求后缀表达式 2 3 1 * + 9 - 的值。
解答:
- 2:压栈- 2
- 3:压栈- 3
- 1:压栈- 1
- *:弹出- 1和- 3,计算- 3 * 1 = 3,压栈- 3
- +:弹出- 3和- 2,计算- 2 + 3 = 5,压栈- 5
- 9:压栈- 9
- -:弹出- 9和- 5,计算- 5 - 9 = -4,压栈- -4
最终结果为 -4
题目3:括号匹配
验证字符串 {[()()]} 是否匹配。
解答:
- {:压栈- {
- [:压栈- [
- (:压栈- (
- ):栈顶是- (,匹配,弹出- (
- (:压栈- (
- ):栈顶是- (,匹配,弹出- (
- ]:栈顶是- [,匹配,弹出- [
- }:栈顶是- {,匹配,弹出- {
最后栈为空,匹配成功。
题目4:括号匹配
验证字符串 [(]) 是否匹配。
解答:
- [:压栈- [
- (:压栈- (
- ]:栈顶是- (,不匹配,匹配失败
结果是匹配失败。