数据结构和算法学习笔记-栈

本文深入探讨了栈这一数据结构的概念,解释了其后进先出的特性,以及如何使用数组和链表实现栈。通过具体代码示例,展示了顺序栈的实现过程,包括初始化、入栈和出栈操作。此外,还讨论了栈在函数调用和表达式求值等场景中的应用。
免责声明,本文内容大多是对数据结构与算法之美课程的学习笔记,内容上面有很多相似之处。也不太适合初学者去直接学习和掌握,仅供有算法经验的同学提供一些,快速回顾算法知识的支持
引入问题:如何实现浏览器的前进后退功能?
如何理解栈?

后进者先出,先进者后出,这个就是典型的“栈”结构

当某个数据集合只设计在一端插入和删除数据,并且满足后进先出的特性,我们就应该首选“栈”这种数据结构

如何实现一个栈?

用 数组实现的叫顺序栈
用链表实现的链式栈

// 基于数组实现的顺序栈
public class ArrayStack {
  private String[] items;  // 数组
  private int count;       // 栈中元素个数
  private int n;           //栈的大小

  // 初始化数组,申请一个大小为n的数组空间
  public ArrayStack(int n) {
    this.items = new String[n];
    this.n = n;
    this.count = 0;
  }

  // 入栈操作
  public boolean push(String item) {
    // 数组空间不够了,直接返回false,入栈失败。
    if (count == n) return false;
    // 将item放到下标为count的位置,并且count加一
    items[count] = item;
    ++count;
    return true;
  }
  
  // 出栈操作
  public String pop() {
    // 栈为空,则直接返回null
    if (count == 0) return null;
    // 返回下标为count-1的数组元素,并且栈中元素个数count减一
    String tmp = items[count-1];
    --count;
    return tmp;
  }
}

线性栈和链式栈的空间复杂度是O(1).时间复杂度是O(1)

支持动态扩容的顺序栈

均摊时间复杂度一半都等于最好情况时间复杂度。

栈在函数调用中的应用

方法栈,栈溢出的原因?

栈在表达式求值的应用
课后思考

1.为什么函数调用要用栈保存临时变量呢?
2.JVM里面的堆栈跟我们说的栈是一回事么?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值