目录
1.定义
1.1 定义
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
1.2 特点
后进先出,只操作栈顶元素
2.为什么存在?
2.1 原因
在特殊场景下,数据只能从尾部插入或者删除的时候,更灵活的数据结构反而容易出错,这时候栈就比较合适。
2.2 常见应用
jvm的栈应用:函数调用要用栈来保存临时变量,括号配对,
3.栈的简单实现
栈可以通过数组(顺序栈)或者链表(链式栈)实现,以下是简单的数组实现代码
public class ArrayStack {
private String[] items;
private int count;
private int n;
public ArrayStack(int n) {
this.n = n;
this.items = new String[n];
this.count = 0;
}
public String pop() {
if (count == 0) return null;
return items[--count];
}
public boolean push(String s) {
if (this.count == this.n) {
//扩容
this.n = 2 * this.n;
String[] strings = new String[n];
for (int i = 0; i < this.count; i++) {
strings[i] = this.items[i];
}
this.items = strings;
}
this.items[count++] = s;
return true;
}
}
4.操作复杂度分析
4.1 出栈
时间复杂度O(1),空间复杂度O(1)
4.2 入栈
4.2.1时间复杂度:
不需要扩容:
最优时间复杂度O(1)
需要扩容:
最差时间复杂度O(n)
均摊时间复杂度:O(1)
4.2.2 空间复杂度
不需要扩容:
空间复杂度O(1)
需要扩容:
空间复杂度O(n)
5.java中栈的源码分析
5.1 继承关系
5.2 常见操作
继承自Vector所以有list的相关操作
push:入栈
pop:出栈
peek:访问栈顶
empty:是否为空
search:查找元素位置