栈是一种数据结构,今天我们先来理解下栈的定义,然后再看几个在现实开发中运用到的实例。
1. 什么是栈?
栈是一个具有“先进后出、后进先出”这种特点的数据结构。

从栈的结构图中可以看出,栈是一种“操作受限”的线性表,只允许在一端插入或删除数据。
从功能上来说,数组或链表可以替代栈,但特定的数据结构是对应特定场景的抽象。当某个数据集合只涉及在一端插入和删除数据,并且满足先进后出、后进先出的特性时,这时候我们就可以选择栈这种数据结构。
2. 如何实现一个栈?
从上面栈的结构图中可以看到栈主要包含了两个操作:入栈和出栈。即在栈顶插入一个数据或删除一个数据。理解栈的定义后,我们就可以实现一个栈了。
数组和链表都可以用来实现栈。用数组实现的栈叫作“顺序栈”,用链表实现的栈叫作“链式栈”。
下面我分别用数组和链表来实现一个栈。
基于数组实现的顺序栈
public class ArrayStack {
private String[] items; // 数组
private int count; // 栈中元素个数
private int n; // 栈的大小
// 初始化数组,申请一个大小为 n 的数组空间
public ArrayStack(int n) {
this.items = new String[n];
this.n = n;
this.count = 0;
}
// 入栈操作
public boolean push(String item) {
// 数组空间不够了,直接返回 false,入栈失败。
if (count == n) return false;
// 将 item 放到下标为 count 的位置,并且 count 加一
items[count] = item;
++count;
return true;
}
// 出栈操作
public String pop() {
// 栈为空,则直接返回 null
if (count == 0) return null;
// 返回下标为 count-1 的数组元素,并且栈中元素个数 count 减一
String tmp = items[count-1];
--count;
return tmp;
}
}
基于链表实现的链式栈
public class StackBasedLinkedList {
private Node top = null;
public void push(int value) {
Node newNode = new Node(value, null);
// 判断是否栈空
if (top == nul