数据结构-栈的使用-括号对应

括号对应检测

思路:
1、如果遇到一个左括号,就将符号压入栈中。
2、如果遇到一个右括号:

  • 栈为空:表示没有相应的左括号与之对应,所以检测不合法
  • 栈不为空:弹出栈顶元素,①如果弹出元素与右括号相对应则合法,②如果弹出元素与右括号不是对应的符号,则检测不合法。

3、其余符号不做操作。
4、如果遍历完所有字符之后,栈不为空,则说明存在多余单个的括号,检测不合法

### 数据结构的应用场景 是一种遵循后进先出(LIFO, Last In First Out)原则的数据结构,在许多计算机科学领域中有着广泛的应用。以下是几个常见的应用场景: #### 1. 表达式求值与语法解析 常用于表达式的计算,尤其是算术表达式的求值。例如,将中缀表达式转换为后缀表达式或前缀表达式的过程中,可以利用来保存运算符和操作数[^1]。 在编译器设计中,也用来分析程序代码的语法规则,帮助识别括号匹配等问题。 #### 2. 函数调用与递归支持 在操作系统和高级编程语言中,函数调用通常依赖于运行时堆。每当一个函数被调用时,它的局部变量、返回地址和其他上下文信息会被压入中;当函数执行完毕后,这些信息会从中弹出并恢复之前的执行状态[^3]。对于递归函数而言,每次递归调用都会创建一个新的帧,直到达到基础条件为止。 #### 3. 浏览器历史记录管理 现代Web浏览器实现了前进/后退按钮的功能,这背后就是基于的思想实现的历史页面导航机制。当前访问过的网页URL依次存放到一个里,点击“回退”即相当于取出最近的一次浏览记录;而再次进入新链接,则重新加入新的项目到该序列末端[^1]。 #### 4. 文本编辑器撤销(Undo)/重做(Redo) 功能 类似于文档编辑软件提供的Undo 和 Redo 操作也是借助两个独立但相互关联的完成:一个是存储已修改动作列表的undoStack ,另一个则是redoStack 。用户每一次更改都将对应的操作推送到前者之上;一旦触发撤消命令,则把最新的一项移除同时放入后者之中以便后续可能存在的还原需求[^1]。 #### 示例代码展示如何使用Python模拟简单的计算器功能: ```python class Stack: def __init__(self): self.items = [] def push(self, item): """向顶添加元素""" self.items.append(item) def pop(self): """从顶移除并返回顶部元素""" if not self.is_empty(): return self.items.pop() def peek(self): """查看顶元素而不移除它""" if not self.is_empty(): return self.items[-1] def is_empty(self): """判断是否为空""" return len(self.items)==0 def evaluate_postfix(expression): stack=Stack() tokens=expression.split(' ') for token in tokens: if token.isdigit(): stack.push(int(token)) elif token in ['+', '-', '*', '/']: b,a=(stack.pop(),stack.pop()) result={'+':a+b,'-':a-b,'*':a*b,'/':int(a/b)}[token] stack.push(result) return stack.pop() print(evaluate_postfix("7 8 + 3 2 / -")) # 输出应为9 ``` 此脚本定义了一个基本版本的`Stack`类,并演示了怎样运用此类解决数学问题——具体来说是从至左评估逆波兰记法形式下的数值串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值