【408考点之数据结构】表达式求值和括号匹配

表达式求值和括号匹配

表达式求值

表达式求值是计算机科学中的一个基本问题,涉及将数学表达式转换为计算机可以理解和处理的形式。通常,我们使用栈来辅助求值过程,特别是在处理中缀表达式转后缀表达式和后缀表达式求值时。

中缀表达式转后缀表达式

中缀表达式(如a + b * c)是我们通常书写数学表达式的形式。为了方便计算机处理,我们将其转换为后缀表达式(逆波兰表达式,RPN)。转换过程如下:

  1. 扫描中缀表达式的每个字符。
  2. 遇到操作数,直接输出。
  3. 遇到左括号,压入栈。
  4. 遇到右括号,不断弹出栈顶元素直到左括号。
  5. 遇到运算符,若其优先级高于栈顶运算符,压入栈,否则不断弹出栈顶运算符直到栈为空或当前运算符的优先级高于栈顶运算符,再将当前运算符压入栈。
后缀表达式求值

后缀表达式(如abc*+)的求值过程如下:

  1. 扫描后缀表达式的每个字符。
  2. 遇到操作数,压入栈。
  3. 遇到运算符,弹出栈顶两个操作数,进行相应运算,并将结果压入栈。
  4. 最终栈顶元素即为表达式的结果。
括号匹配

括号匹配是验证括号在表达式中是否成对出现和正确嵌套的过程。常见的括号有圆括号()、方括号[]和花括号{}。匹配过程通常使用栈实现:

  1. 扫描输入字符串,遇到左括号压入栈。
  2. 遇到右括号,检查栈顶元素是否为对应的左括号,若是则弹出栈顶元素,否则匹配失败。
  3. 最后栈为空则匹配成功,否则匹配失败。

实际题目及解答

题目1:中缀表达式转后缀表达式

将中缀表达式 a + b * (c - d) 转换为后缀表达式。

解答:

  1. a:输出 a
  2. +:压栈 +
  3. b:输出 b
  4. *:压栈 *
  5. (:压栈 (
  6. c:输出 c
  7. -:压栈 -
  8. d:输出 d
  9. ):弹出栈顶元素 - 输出,再弹出栈顶元素 (
  10. 弹出栈顶元素 * 输出
  11. 弹出栈顶元素 + 输出

最终后缀表达式为:ab c d - * +

题目2:后缀表达式求值

求后缀表达式 2 3 1 * + 9 - 的值。

解答:

  1. 2:压栈 2
  2. 3:压栈 3
  3. 1:压栈 1
  4. *:弹出 13,计算 3 * 1 = 3,压栈 3
  5. +:弹出 32,计算 2 + 3 = 5,压栈 5
  6. 9:压栈 9
  7. -:弹出 95,计算 5 - 9 = -4,压栈 -4

最终结果为 -4

题目3:括号匹配

验证字符串 {[()()]} 是否匹配。

解答:

  1. {:压栈 {
  2. [:压栈 [
  3. (:压栈 (
  4. ):栈顶是 (,匹配,弹出 (
  5. (:压栈 (
  6. ):栈顶是 (,匹配,弹出 (
  7. ]:栈顶是 [,匹配,弹出 [
  8. }:栈顶是 {,匹配,弹出 {

最后栈为空,匹配成功。

题目4:括号匹配

验证字符串 [(]) 是否匹配。

解答:

  1. [:压栈 [
  2. (:压栈 (
  3. ]:栈顶是 (,不匹配,匹配失败

结果是匹配失败。

相关推荐
XiaoLeisj几秒前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
乐之者v1 小时前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
️南城丶北离3 小时前
[数据结构]图——C++描述
数据结构··最小生成树·最短路径·aov网络·aoe网络
✿ ༺ ོIT技术༻3 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
菜鸡中的奋斗鸡→挣扎鸡11 小时前
滑动窗口 + 算法复习
数据结构·算法
axxy200012 小时前
leetcode之hot100---240搜索二维矩阵II(C++)
数据结构·算法
Uu_05kkq13 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
1nullptr15 小时前
三次翻转实现数组元素的旋转
数据结构