深入理解 Java 中的栈和队列
1. 引言
在计算机科学里,栈(Stack)和队列(Queue)是两种基础且重要的抽象数据类型(ADT)。尽管它们看起来简单,甚至有些不值得深入研究,但实际上在编程的各个角落都有广泛的应用。就像生活中的抽屉和架子,虽然简单,却无处不在。研究栈和队列有助于我们理解最基本的数据结构,而且在解决问题时,我们常常希望寻找最简单的解决方案,栈和队列就能派上用场。同时,它们也是计算机科学基础文化的一部分,掌握使用这些原始结构和相关术语对我们很有帮助。
2. 栈和队列的基础
栈和队列与列表类似,都用于存储有序的值序列。对于这样的结构,至少需要以下几种基本操作:
- 向结构中添加值(“添加”操作)
- 从结构中取出值(“移除”操作)
- 检查结构中是否还有值(结构是否为空)
在 Java 中,除了上述基本操作,还提供了 size
方法用于获取结构中元素的数量,以及 peek
方法用于查看下一个要移除的值,但不实际移除它。
栈是后进先出(LIFO)结构,即最后插入的元素最先被访问。而队列是先进先出(FIFO)结构,即最先插入的元素最先被访问。
2.1 栈的概念
栈的所有操作都在其一端进行,这一端被称为栈顶。添加操作称为 push
,移除操作称为 pop
。可以将栈类比为自助餐厅中堆叠的托盘,取托盘时总是从顶部拿取,添加新托盘时也放在顶部。这就导致栈中的元素顺序会被反转,新元素总是添加到栈顶,取出时也从栈顶开始,所以元素出来的顺序与