栈(Stack)
1. 概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底
栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据在栈顶
栈的常用方法:
方法 | 解释 |
E push(E item) | 压栈 |
E pop() | 出栈 |
E peek() | 查看栈顶元素 |
boolean empty() | 判断栈是否为空 |
2. 顺序栈
底层使用数组来实现
利用顺序表实现,即使用尾插 + 尾删的方式实现
顺序栈的代码实现:
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;
}
}
3. 链式栈
底层用单链表来实现
链式栈代码实现:
class LinkStack<T>{
private Entry<T> bottom;
private int count;
public LinkStack(){
bottom = new Entry<>(null, null);
}
public void push(T val){
Entry<T> node = new Entry<>(val, bottom.next);
bottom.next = node;
count++;
}
public T pop(){
if(empty())
return null;
T val = bottom.next.data;
bottom.next = bottom.next.next;
count--;
return val;
}
public T peek(){
if(empty())
return null;
return bottom.next.data;
}
public boolean empty(){
return bottom.next == null;
}
public int size(){
return this.count;
}
static class Entry<T>{
T data;
Entry<T> next;
public Entry(T data, Entry<T> next) {
this.data = data;
this.next = next;
}
}
}