什么是栈
栈(Stack)也叫作堆栈,是允许在同一端进行插入和删除操作的特殊线性表。其中允许插入和删除操作的一端叫作栈顶(Top),另一端叫作栈底(Bottom),栈底是固定的,栈顶是浮动的,栈中的元素为0时,栈是空栈。插入叫作进栈(push),删除叫作出栈(pop),栈也叫作后进先出(FILO)的线性表。
核心方法:
- push():向栈中压入一个数据,先入栈的数据在最下边。
- pop():弹出栈顶数据,移除栈顶数据。
- peek():查询当前栈顶的数据。
代码实现
package datastructure;
import java.util.Arrays;
/**
* 数组实现顺序栈
* @param <E>
*/
public class Stack<E> {
private Object[] data = null;
private int maxSize = 0;//栈的容量
private int top = -1;//栈顶的指针
public Stack(){
//默认容量10个
this(10);
}
public Stack(int initialSize){
if(initialSize < 0){
throw new RuntimeException("初始化大小不能小于0:"+initialSize);
}
this.maxSize = initialSize;
data = new Object[initialSize];
top = -1;
}
/**
* 数据入栈
* @param e
* @return
*/
public boolean push(E e){
//top从0开始计算,10个数top最大值是9,maxSize等于10
if(top == maxSize - 1){
throw new RuntimeException("栈已满,无法将元素入栈");
}else{
data[++top] = e;
return true;
}
}
/**
* 数据出栈,弹出栈顶
* @return
*/
public E pop(){
if(top == - 1){
throw new RuntimeException("栈为空");
}
E value = (E)data[top];
data[top--] = null;
return value;
}
/**
* 查询栈顶,不移除
* @return
*/
public E peek(){
if(top == - 1){
throw new RuntimeException("栈为空");
}else{
return (E)data[top];
}
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println("数组元素:"+ Arrays.toString(stack.data));
System.out.println("删除:"+stack.pop());
System.out.println("数组元素:"+ Arrays.toString(stack.data));
System.out.println("查询栈顶:"+stack.peek());
stack.push(4);
System.out.println("数组元素:"+ Arrays.toString(stack.data));
System.out.println("查询栈顶:"+stack.peek());
}
}
执行结果: