相关知识
栈的基本概念
栈是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算,这一端被称为栈顶。栈既可以采用顺序存储,也可以采用链接存储来实现。下面给出了一种基于顺序存储的栈的实现方案:
如图 1 所示:该栈存储了 4 个元素 {56,77,15,12} ,其中 12 是栈顶元素。
这种实现方案将栈元素存储在一片连续的空间中,栈相关的三个属性元素data、top和max介绍如下:
- data: 给出栈存储空间的起始地址;
- top: 存放栈顶元素的位置编号;
- max: 指明栈存储空间中最多可存储的数据元素个数
特别说明:空间的开始地址为data,连续空间里的位置编号从data所指的开始位置起,到该空间的结束位置,编号依次是0,1,2,…,max-1。在图 1 的示例中max=6。栈顶元素的位置编号由top给出。
栈结构的定义(C)
基于data、top、max组织成的栈结构如下所示:
struct SeqStack
{
T* data; // 数据元素指针
int top; // 栈顶元素编号
int max; // 最大结点数
};
为了讨论简单,我们假设栈元素的数据类型为整数:
typedef int T; // 栈元素#的数据类型
据此,只要给定指向该结构的一指针 ss ,就可对栈进行进栈出栈操作。
- 进行进栈操作时,新进栈的元素保存在 top+1 位置,进栈后 top 加 1 ,这时的状态则如图 2 所示。
- 进行出栈操作时,将位置编号为 top 的元素出栈,出栈后 top 减去 1 ,这时的状态则如图 3 所示。
顺序栈的操作
以顺序存储的栈为例,我们定义如下操作:
创建栈:
创建一个最多可以存储 maxlen 个元素的顺序栈。具体操作函数定义如下:
SeqStack* SS_Create(int maxlen);
释放栈空间:
释放栈所占用的空间。具体操作函数定义如下:
void SS_Free(SeqStack* ss);
清空一个栈:
将栈中元素清空。具体操作函数定义如下:
void SS_MakeEmpty(SeqStack* ss);
判断栈是否为满:
若栈为满,则返回 true,否则返回false。具体操作函数定义如下:
bool SS_IsFull(SeqStack* ss);
判断栈是否为空:
若栈为空,则返回true,否则返回false。具体操作函数定义如下: