1. 栈的介绍
注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈
栈(stack)是限定仅在表尾一端进行插入或删除操作的特殊线性表。对于栈来说, 允许进行插入或删除操作的一端称为栈顶(top),而另一端称为栈底(bottom)。不含元素栈称为空栈,向栈中插入一个新元素称为入栈或压栈, 从栈中删除一个元素称为出栈或退栈。
假设有一个栈S=(a1, a2, …, an), a1先进栈, an最后进栈。称a1为栈底元素, an为栈顶元素, 如图3.1所示。出栈时只允许在栈顶进行, 所以an先出栈, a1最后出栈。因此又称栈为后进先出(Last In First Out,LIFO)的线性表。
栈(stack),是一种线性存储结构,它有以下几个特点:
- 栈中数据是按照”后进先出(LIFO, Last In First Out)”方式进出栈的。
- 向栈中添加/删除数据时,只能从栈顶进行操作。
栈通常包括的三种操作:push、peek、pop。
- push – 向栈中添加元素。
- peek – 返回栈顶元素。
- pop – 返回并删除栈顶元素的操作。
1.1 栈的示意图
栈中的数据依次是 30 –> 20 –> 10
1.2 出栈
出栈前:栈顶元素是30。此时,栈中的元素依次是 30 –> 20 –> 10
出栈后:30出栈之后,栈顶元素变成20。此时,栈中的元素依次是 20 –> 10
1.3 入栈
入栈前:栈顶元素是20。此时,栈中的元素依次是 20 –> 10
入栈后:40入栈之后,栈顶元素变成40。此时,栈中的元素依次是 40 –> 20 –> 10
2. 栈的Java实现
JDK包中也提供了”栈”的实现,它就是集合框架中的Stack类。本部分给出2种Java实现
2.1 栈的数组实现
数组实现的栈,能存储任意类型的数据
|
|
运行结果:
|
|
结果说明:GeneralArrayStack是通过数组实现的栈,而且GeneralArrayStack中使用到了泛型
2.2 栈Stack
Java的 Collection集合 中自带的”栈”(stack)的示例
|
|
运行结果:
|
|
3. Stack详细介绍
学完Vector了之后,接下来我们开始学习Stack。Stack很简单,它继承于Vector。学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码;最后再通过实例来学会使用它。内容包括:
- 第1部分 Stack介绍
- 第2部分 Stack源码解析(基于JDK1.6.0_45)
- 第3部分 Vector示例
3.1 Stack介绍
Stack是栈。它的特性是:先进后出(FILO, First In Last Out)。
java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。当然,我们也可以将LinkedList当作栈来使用!在“Java 集合系列06之 Vector详细介绍(源码解析)和使用示例”中,已经详细介绍过Vector的数据结构,这里就不再对Stack的数据结构进行说明了。
3.2 Stack的继承关系
|
|
Stack和Collection的关系如下图
4. 栈
4.1 栈的LinkedList实现
|
|
4.2 栈的数组实现
|
|
4.3 栈实例1:单词逆序
|
|
4.4 栈实例2:分隔符匹配
|
|
4.5 栈的链表实现
|
|