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