栈:一种操作受限的线性表,只允许在一端插入和删除数据。
如何理解栈
汉诺塔你有没有玩过,每根柱子上的碟子每次只能操作最上层的一个,或者,你可以想象平时生活中的盘子的堆叠方式,每次我们使用时都是从最上层拿一个,放的时候也是放在最上次,这种类型的结构就是典型的栈结果,满足,后进先出、先进后出的特点,这也是栈的数据结构特点。
由于我们每次只能操作栈顶元素,因此说栈是操作受限的线性表。
当要操作的数据集合只涉及在一端插入和删除数据,并满足先进后出、后进先出性,就可首选栈。
了解了栈的基本结构,我们来看看如何实现一个栈。
如何实现一个栈
栈即可用数组实现,也可用链表来实现,数组实现的栈叫顺序栈,链表实现的栈叫链式栈。
以下,我们用数组来模拟一下栈的基本操作。
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;
}
}
至此,栈的基本内容就结束了。
栈的其他应用
- 表达式求值
- 函数调用栈
- 括号匹配
- 浏览器的前进后退功能。