目录
一、概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。
二、Stack类的实现
1. 利用顺序表实现,即使用尾插 + 尾删的方式实现
2. 利用链表实现,则头尾皆可
1.顺序表实现
相对来说,顺序表的实现上要更为简单一些,所以我们优先用顺序表实现栈。
public class MyStack {
// 简单起见,我们就不考虑扩容问题了
private int[] array = new int[100];
private int size = 0;
public void push(int v) {
array[size++] = v;
}
public int pop() {
return array[--size];
}public int peek() {
return array[size - 1];
}
public boolean isEmpty() {
return size == 0;
}
public int size() {
return size;
}
}
2.链表实现
2.1 双向链表
从头入栈,出栈和从尾入栈,出栈的时间复杂度均为O(1),因为每个节点有两个指针域,在无需遍历整个链表的情况下直接添加或删除头部和尾部。
2.2 单向链表
头部:
入栈:在单链表中,头部添加一个元素。
eg.
入栈1:1
入栈2:2->1
入栈3:3->2->1
出栈:从单链表中,头部移除一个元素。
eg.
出栈3:2->1
出栈2:1
出栈1:空
时间复杂度:O(1)
尾部:
入栈:在单链表尾部添加一个元素(需要遍历链表)。
eg.
入栈1:1
入栈2:1->2
入栈3:1->2->3
出栈:在单链表的尾部移除一个元素(需要遍历链表)。
eg.
出栈3:1->2
出栈2:1
出栈1:空
时间复杂度:O(N)