栈的应用
中缀转后缀表达式
算法思想:利用栈存储运算符,遇到操作数直接输出,遇到运算符根据优先级决定入栈或出栈。
转换规则:
- 从左到右扫描中缀表达式
- 遇到操作数:直接输出到后缀表达式
- 遇到运算符:
- 若栈空或栈顶为 ’(‘:运算符入栈
- 若运算符优先级大于栈顶运算符:入栈
- 若运算符优先级小于等于栈顶运算符:栈顶元素出栈并输出,重复比较直到满足入栈条件
- 遇到 ’(‘:直接入栈
- 遇到 ’)‘:栈顶元素出栈并输出,直到遇到 ’(’,’(’ 出栈但不输出
- 扫描结束:栈中剩余运算符全部出栈并输出
运算符优先级: > > (同级从左到右运算)
示例: →
- 扫描 a:输出 a
- 扫描 +:入栈
- 扫描 b:输出 b
- 扫描 *:优先级高于 +,入栈
- 扫描 c:输出 c
- 结束:* 出栈输出,+ 出栈输出
后缀转中缀表达式
算法思想:利用栈存储操作数,遇到运算符时弹出两个操作数进行组合。
转换规则:
- 从左到右扫描后缀表达式
- 遇到操作数:入栈
- 遇到运算符:
- 弹出栈顶两个元素作为右操作数和左操作数
- 组合成 的中缀表达式
- 将组合结果入栈
- 扫描结束:栈顶元素即为中缀表达式
示例: →
- 扫描 a:a 入栈
- 扫描 b:b 入栈
- 扫描 c:c 入栈
- 扫描 *:弹出 c 和 b,组合 入栈
- 扫描 +:弹出 和 a,组合 入栈
括号匹配
问题描述:判断表达式中的括号是否正确匹配,包括小括号 ()、中括号[]、大括号{}。
算法思想:利用栈的后进先出特性,左括号入栈,右括号与栈顶匹配。
匹配规则:
- 从左到右扫描字符串
- 遇到左括号 、、:入栈
- 遇到右括号 、、:
- 若栈空:匹配失败
- 若栈顶括号与当前右括号匹配:出栈继续
- 若不匹配:匹配失败
- 扫描结束:栈空则匹配成功,否则失败
括号对应关系:
| 左括号 | 右括号 |
|---|---|
| ( | ) |
| [ | ] |
| { | } |
算法实现要点:
- 时间复杂度:
- 空间复杂度:(最坏情况全为左括号)
- 只需关注括号字符,忽略其他字符
典型应用:编译器语法检查、表达式合法性验证、代码编辑器括号高亮等。