数据结构——栈与深度优先遍历

本文介绍了栈这种数据结构及其应用,特别是后缀表达式的计算和转换,以及深度优先遍历(DFS)在岛屿数量和克隆图问题中的应用。通过栈实现后缀表达式的计算,包括使用二叉树、加括号法等方法。同时,探讨了DFS在解决实际问题时如何避免递归导致的堆栈溢出,并提供了相关力扣题目作为实践案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、栈

栈是一种先进后出的数据结构,关于栈的js实现:我的git仓库

二、栈的应用

2.1 后缀表达式

后缀表达式也叫逆波兰表达式,平时我们使用的表达式如 1+2*3 是中缀表达式符合人民的阅读习惯,为了让计算机也能够理解表达式的意思,就需要使用后缀表达式 1 2 3 * +

2.1.1 用栈计算后缀表达式
  • 创建两个栈,一个为stack动态存放运算符,一个为post存放后缀表达式
  • 从左到右扫描中缀表达式,若都到操作数,直接存入post栈中,若读到的是运算符:
    1. 栈为空时或左括号(直接存入stack
    2. 遇到右括号)将stack中与左括号间的运算符全部出栈,存入post栈中,注意:左右括号()直接消除,不需要存入栈中
    3. 非括号且栈不为空,将该运算符和stack栈顶运算符做比较:高于或等于栈顶运算符就直接存入stack,否则将栈顶元素出栈,存入post,然后存入该运算符到stack
2.1.2 用二叉树
  • 将中缀表达式转换为表达式树
    1. 表达式树的根节点为优先级最低且最靠右的操作数
    2. 表达式树的树叶为操作数,其它节点是操作符
  • 后序遍历表达式树得到后缀表达式
    参考:表达式树
2.1.3 加括号法
  • 按运算符优先级对中缀表达式加括号,原先的括号不用管
  • 将运算符移到括号的后面
  • 去掉所有括号
2.1.4 后缀表达式转中缀表达式
  • 从左到右遍历后缀表达式
  • 用辅助栈temp存储结果
    1. 将操作数放入辅助栈temp
    2. 遇到操作符,弹出temp栈中后两个操作数,与操作符计算后重新放入temp
    3. 直到遍历完,temp中的数就是最后的结果
力扣:逆波兰表达式求值

力扣739:每日温度

1.递减栈的使用
let Node = function(idx, val) {
   
    this.idx = idx;
    this.val = val;
}
var dailyTemperatures = function(T) {
   
    const len = T.length;
    if(!len) return [];
    let stack = [];
    let list = new Array(len);
    for(let i = 0; i < len; i++) {
   
        // 当递减栈为空,就把元素加入栈中
        if(stack
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值