免责声明,本文内容大多是对数据结构与算法之美课程的学习笔记,内容上面有很多相似之处。也不太适合初学者去直接学习和掌握,仅供有算法经验的同学提供一些,快速回顾算法知识的支持
引入问题:如何实现浏览器的前进后退功能?
如何理解栈?
后进者先出,先进者后出,这个就是典型的“栈”结构
当某个数据集合只设计在一端插入和删除数据,并且满足后进先出的特性,我们就应该首选“栈”这种数据结构
如何实现一个栈?
用 数组实现的叫顺序栈
用链表实现的链式栈
// 基于数组实现的顺序栈
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里面的堆栈跟我们说的栈是一回事么?
本文深入探讨了栈这一数据结构的概念,解释了其后进先出的特性,以及如何使用数组和链表实现栈。通过具体代码示例,展示了顺序栈的实现过程,包括初始化、入栈和出栈操作。此外,还讨论了栈在函数调用和表达式求值等场景中的应用。

被折叠的 条评论
为什么被折叠?



