栈的简述
栈(Stack)是一种常用的数据结构,栈只能从一端读写数据,它是一个典型的”后进先出“队列。可以操作的位置叫做栈顶,而栈底则不允许操作。
栈通常有2个关键方法:
- 进栈(push):将元素添加到栈队列中,成为栈顶元素。
- 出站(pop):将栈顶元素弹出队列。
栈通常可以通过两种方式来实现,接下来我们将自定义栈的实现。
数组来实现栈
通过数据可以实现栈,但需要注意以下几个问题:
- 首先,数组必须是可扩容的。
- 数组扩容时,我们可以采用将容量扩大一倍,当数组元素不足容量的1/4时,我们将数组容量缩小一半。
- Stack通常要支持泛型,但Java无法进行泛型数组的初始化,我们可以先创建一个Object数组,然后将其强转为泛型数组。
代码实现:
public class Stack<T>{
private T[] arr;
private int index;
public Stack(){
arr = (T[])new Object[1];
index = 0;
}
public void push(T v){
if (index == arr.length){
resize(arr.length * 2);
}
arr[index++] = v;
}
public T pop(){
if(index == 0){
return null;
}
T v = arr[--index];
arr[index] = null;
if (index > 0 && index<=arr.length/4){
resize(arr.length/2);
}
return v;
}
private void resize(int size){
if (size <= 1){
return;
}
T[] newArr = (T[])new Object[size];
for (int i=0;i<index;i++){
newArr[i] = arr[i];
}
arr = newArr;
}
}
链表来实现栈
链表实现栈非常简单,我们直接来看代码:
public class Stack<T> {
private class Node<T> {
public Node<T> next;
public T mValue;
public Node(T v){
mValue = v;
next = null;
}
}
private Node<T> mHead = null;
public void push(T v){
Node<T> node = new Node<>(v);
node.next = mHead;
mHead = node;
}
public T pop(){
if (mHead == null){
return null;
}
T v = mHead.mValue;
mHead = mHead.next;
return v;
}
}
总结
- 栈(Stack)是一种常用的数据结构,栈只能从一端读写数据,它是一个典型的”后进先出“队列。可以操作的位置叫做栈顶,而栈底则不允许操作。
- 进栈(push):将元素添加到栈队列中,成为栈顶元素。
- 进栈(push):将元素添加到栈队列中,成为栈顶元素。
- 本文使用数组和链表分别实现了栈。