顺序栈的实现和两栈共享空间
以后慢慢启用个人博客:http://www.yuanrengu.com/
一.顺序栈的实现
栈(stack)是限定仅在表尾进行插入或删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
理解栈的定义需要注意:
- 首先他是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过他是一种特殊的线性表而已。定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。
- 他的特殊之处就在于限制了这个线性表的插入和删除位置,他始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。
栈的插入操作,叫作进栈,也称压栈、入栈。栈的删除操作,叫出栈,也称弹栈。
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
顺序栈的定义:
typedef struct{ ElemType *bottom; ElemType *top; int StackSize; }SqStack;
其中,StackSize指示栈的当前可使用的最大容量。栈的初始化操作为:按设定的初始状态分配量进行第一次存储分配,bottom可称为栈底指针,在顺序栈中,他始终指向栈底的位置,如bottom的值为NULL,则表明栈结构不存在。称top为栈顶指针,其初值指向栈底,即top=bottom可作为栈空的标记,每当插入新的栈顶元素时,指针top增1;删除栈顶元素时,指针top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。如下图所示。
base = NULL; //栈结构不存在 top = base; //栈空
顺序栈的实现:
头文件stack.h
1 //stack.h 2 3 #define TRUE 1 4 #define FALSE 0 5 #define OK 1 6 #define ERROR 0 7 #define OVERFLOW -1 8 #define UNDERFLOW -2 9 10 11 12 //定义函数返回值类型 13 typedef int Status; 14 //定义顺序栈的数据元素的类型 15 typedef int ElemType; 16 17 18 //定义顺序栈的存储结构 19 20 #define STACK_INIT_SIZE 100 //初始分配空间大小 21 22 #define INCREMENTSIZE 10 //存储空间分配增量 23 struct SeqStack{ 24 ElemType *bottom; //栈底指针 25 ElemType *top; //栈顶指针 26 int size; //栈存储空间大小 27 }; 28 29 //声明顺序栈的基本操作 30 Status InitStack(SeqStack &s); //构造一个空栈 31 Status DestroyStack(SeqStack &s); //销毁一个栈 32 Status ClearStack(SeqStack &s); //把栈置空 33 Status StackEmpty(SeqStack s); //判断是否为空栈 34 Status StackLength(SeqStack s); //返回栈的长度(即元素个数) 35 Status Push(SeqStack &s,ElemType e); //元素入栈 36 Status Pop(SeqStack &s,ElemType &e); //元素出栈 37 Status GetTop(SeqStack s,ElemType &e); //返回栈顶元素 38 Status StackTraverse(SeqStack s); //遍历栈