栈(Stack)
栈:一种特殊的线性表,只允许在固定的一段进行插入和删除操作。进行插入和删除操作的一端是栈顶,另一端为栈底。栈中的数据都遵循后进先出的原则。
- 入栈(压栈/进栈):插入操作。
- 出栈:删除操作。
利用顺序表实现栈的一些简单操作
方法 | 描述 |
---|---|
peek() | 查看栈顶元素 |
pop() | 出栈 |
push() | 入栈 |
empty() | 判断是否为空栈 |
public class MyStack<T> {
public T[] elem;
public int top; //表示当前可以存放数据元素的下标
public MyStack(){
this.elem = (T[])new Object[10];
}
//入栈
/*
*判断栈是否为满栈
*若是满栈,则扩容栈
*不是满栈,将数据插入栈中
*/
public void push(T val){
if (full()){
//扩容
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
this.elem[this.top] = val;
this.top++;
}
//出栈
/*
*判断栈是否为空栈
*若是空栈,则抛出空栈异常
*不是空栈,则删除并返回栈顶元素
*/
public T pop(){
if (empty()){
throw new RuntimeException("栈空!");
}
T data = this.elem[this.top-1];
this.top--;
return data;
}
//查看栈顶元素
/*
*判断栈是否为空栈
*若是空栈,则抛出空栈异常
*不是空栈,则返回栈顶元素
*/
public void peek(){
if (empty()){
throw new RuntimeException("栈空!");
}
System.out.println(this.elem[this.top - 1]);
}
//判断是否为空栈
public boolean empty(){
return this.top == 0;
}
//满栈
public boolean full(){
return this.top == this.elem.length;
}
}
//测试
public class Test {
public static void main(String[] args) {
MyStack<Integer> myStack = new MyStack<Integer>();
myStack.push(3); //入栈
myStack.push(5);
myStack.push(6);
myStack.push(1);
myStack.push(2);
myStack.peek(); //查看栈顶元素 2
myStack.pop(); //出栈,删除栈顶元素
myStack.peek(); //查看栈顶元素 1
System.out.println(myStack.empty()); //判空栈 false
}