栈(stack)又名后进先出表,它是一种运算受限的线性表。
其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
进栈:入栈或压栈,将新元素放到栈顶元素的上面,使之成为新的栈顶元素
出栈:退栈,将栈顶元素删除掉,使得与其相邻的元素成为新的栈顶元素
通过数组来实现栈。定义数组elements,有一个当前栈顶的指针top,从图中可以看出:
- 空栈:top = -1;
- 栈满:top == elements.length - 1;
Java代码如下:
import java.util.Arrays;
/**
* @author lichen
* @version 1.0.0
* @date 2020-05-14 15:40
*/
public class MyStack {
Object[] elements;
int top = -1;
public MyStack(int initSize) {
this.elements = new Object[initSize];
}
public boolean isFull() {
return top == elements.length - 1;
}
public boolean isEmpty() {
return top == -1;
}
public Object peek() {
return elements[top];
}
public Object push(Object data) {
if (isFull()) {
return null;
}
top++;
elements[top] = data;
return data;
}
public Object pop() {
if (isEmpty()) {
return null;
}
Object topData = elements[top];
// GC
elements[top] = null;
top--;
return topData;
}
public static void main(String[] args) {
MyStack stack = new MyStack(5);
stack.push(4);
stack.push(5);
stack.push(6);
stack.push(7);
stack.push(8);
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.peek());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.push(9));
System.out.println(Arrays.toString(stack.elements));
}
}