栈结构——顺序栈、链栈
栈结构的定义和属性#
定义:栈是一种与线性表相似的线性结构。
不同之处是当需要对节点做增删操作时,只能操作栈顶的节点,因此具有先进后出(或者后进先出)的特点。
按存储结构的不同,可分为顺序栈和链栈。
栈结构的几个属性:
- 栈顶/栈底:可接受节点增删操作的一端称为栈顶,另一端称为栈底
- 入栈:在栈顶一端新增节点的操作称为入栈
- 出栈:在栈顶一端删除节点的操作称为出栈
- 栈满:当栈中节点超过允许存储空间时,表示栈满(链栈无栈满的状态)
- 栈空:当栈中无节点元素时,表示栈空
栈结构的抽象数据类型#
1 | ADT Stack |
对比线性表的抽象数据类型可以发现,栈的抽象数据类型少了 返回指定序号的元素 和 返回指定元素的序号 两个方法,并且插入节点和删除节点方法也有位置上的限制,这些在计算上的限制正是栈结构的特点,因此栈也被称为受限的线性表。
顺序栈#
顺序栈的存储结构是利用一组地址连续的存储空间依次存放自栈底到栈顶的数据元素,同时设置栈顶元素的下标 top
指向栈顶元素的位置。
定义顺序栈的存储结构:
1 |
|
顺序栈代码实现:
1 |
|
链栈#
链栈的实现与头插法的链表很相似。
链栈的存储结构定义为:
1 | typedef int ElemType; |
链栈的存储结构与链表一样,区别在于链表的指针始终指向第一个节点,而链栈的指针始终指向栈顶节点。
链栈的存储结构也可以定义为:
1
2
3
4
5
6
7
8
9
10
11 >typedef int ElemType;
>typedef struct Node
>{
ElemType data;
struct Node *next;
>} stackNode;
>typedef struct
>{
stackNode *top;
>} stackLink;但是结构体变量
stackLink
只包含一个成员,所以直接把成员定义成变量。因为
struct Node *next
与stackNode *top
一样作用,所以直接使用结构体变量stackNode
初始化链栈。最后链栈的存储结构定义为:
1
2
3
4
5
6 >typedef int ElemType;
>typedef struct Node
>{
ElemType data;
struct Node *next;
>} stackLink;
链栈的抽象运算与顺序栈一致,但是由于存储结构不一样,所以具体实现也完全不一样。
链栈代码实现:
1 |
|