栈和队列
阅读目录
一、栈
二、队列
一、栈
1.栈的定义
栈是限定仅在表尾进行插入或删除操作的线性表。因此对栈来说,表尾端有其特殊含义,称栈顶,相应的表头端称为栈底。栈又称为后进先出(LIFO)线性表。
2.基本操作
InitStack(&S) //构造一个空栈S
DestroyStack(&S) //栈S被销毁
ClearStack(&S) //将S清为空栈
StackLength(S) //返回S的元素个数,即栈的长度
GetTop(S,&e) //用e返回S的栈顶元素
Push(&S,e) //插入元素e为新的栈顶元素
Pop(&S,&e) //删除S的栈顶元素,并用e返回其值
StackTraverse(S,visit()) //从栈底到栈顶依次对S的每个数据元素调用visit()。一旦visit()失败,则操作失败。
3.栈的表示和实现
3.1顺序栈
3.1.1定义
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
3.1.2实现
#define MaxSize 50
typedef struct{
ElemType data[MaxSize]
int top;
}SqStack;
3.1.3基础操作
//初始化空栈
void InitStack(SqStack &s){
s.top = -1;
}
//判断空栈
bool StackEmpty(SqStack S){
if(S.top == -1)
return true;
else
return false;
}
//进栈
bool Push(SqStack &S, ElemType x){
if(S.top == Maxsize-1){
return false;
}
S.data[++S.top] = x;
return true;
}
//出栈
bool Pop(SqStack &S, ElemType &x){
if(S.top == -1){
return false;
}
x = S.data[S.top--];
return true;
}
//读取栈顶元素
bool GetTop(SqStack S, ElemType &x){
if(S.top == -1){
return false;
}
x = S.data[S.top];
return true;
}
3.2共享栈
3.2.1定义
将两个栈底设置在共享空间的两端,栈顶想空间中延伸。
优点:存取时间复杂度任为O(1),但空间利用更加有效
3.2.2基础操作
//判空条件
1号栈top == -1
2号栈top == MaxSize
//栈满
top2-top1 == 1
3.3链式栈
3.3.1定义
采用链式存储的栈
3.3.2实现
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}*LiStack;
//所有的操作都在表头进行
二、队列
1.队列的定义
和栈相反,队列是一种先进先出(FIFO)的线性表。它只允许在表的一端插(队尾)入,另一端(队头)删除。
2.基本操作
InitQueue(&Q) //构造一个空队列Q
DestroyQueue(&Q) //销毁队列Q
ClearQueue(&Q) //将Q清为空队列
QueueEmpty(Q) //若Q为空队列,则返回TRUE,否则返回FALSE
QueueLength(Q) //返回Q的元素个数,即队列的长度
GetHead(Q, &e) //用e返回Q的队头元素
EnQueue(&Q,e) //插入元素e为Q的新的队尾元素
DeQueue(&Q,&e) //删除Q的队头元素,并用e返回其值