1.栈(stack)是运算受限的线性表,这种线性表上的**插入和删除运算限定在表的某一端进行,允许进行插入和删除的一端称为栈顶,另一端称为栈底.**不含任何数据元素的栈称为空栈.处于栈顶位置的元素称为栈顶元素.
栈的修改原则是后进先出,因此,栈又称为后进先出线性表,简称后进先出表.栈的插入和删除运算分别称为进栈和出栈.
2.栈的基本运算:
- 初始化 initStack(S):构造一个空栈;
int Initstack(SeqStk *stk){
stk->top=0;
return 1;
}
- 判栈空 EmptyStack(S):若栈s为空栈,其结果为1 否则结果为0;
int EmptyStack(SeqStk *stk){
if(stk->top==0) return 1;
else return 0;
}
- 进栈Push(c,x):将元素x插入栈S中,使x成为S的栈顶元素;
int Push(SeqStk *stk,DataType x){
if(stk->top==maxsize-1){
error("栈满");return 0;
}esle {
stk->top++;
stk->data[stk->top]=x;
return 1;
}
}
4)出栈Pop(S):删除栈顶元素;
int Pop(SeqStk *stk){
if(stk->top==0){
error("栈空");return 0;
}else {
stk->top--;
return 1;
}
}
5)取栈顶GetTop(S):返回栈顶元素;
DataType GetTop(SeqStk *stk){
if(EmptyStack(stk))
return NULLData;
else
return stk->data[stk->top];
}
3.栈的基本运算在顺序栈上的实现算法:
1)当空栈:栈顶下标值top==0,如果此时做出栈运算 ,则产生 “下溢”.
2)当栈中的数据元素已经填满了,如果再进行进栈操作,会发生"上溢"
4.队列(Queue)是有限同类数据元素的线性序列,是一种先进先出(First In First Out)的线性表,新增加的数据元素插在队列尾端,出队的数据元素在队列首部被删除.(排队的规则是不允许插队)
5.队列的基本运算:
1)队列初始化 InitQueue(Q):设置一个空队列Q;
void InitQueue(CycQue,CQ){
CQ.front=0;CQ.rear=0;
}
2)判断队列为空 EmptyQueue(Q):若队列Q为空,则返回值为1,否则返回值为0;
int EmptyQueue(CycQue CQ){
if(CQ.rear==CQ.front) return 1;
else return 0;
}
3)入队列EnQueue(Q,x):将数据元素x从队尾一端插入队列,使其成为队列的新尾元素;
int EnQueue(CyCQue CQ,DataTYpe x){
if((CQ.rear+1)%maxsize==CQ.front){
error("队列满");return 0;
}else {
CQ.rear==(CQ,rear+1)%maxsize;
CQ.data[CQ.rear]=x;
return 1;
}
}
4)出队列 OutQueue(Q);删除对列首元素;
int OutQueue(CycQue CQ){
if(EmptyQueue(CQ)){
error("队列空");return 0;
}else {
CQ.front=(CQ.front+1)%maxsize;
return 1;
}
}
5)取队列首元素GetHead(Q):返回队列首元素的值.
DataType GetHead(CycQue CQ){
if(Empty(CQ))
return NULLData;
else
return CQ.data[(CQ.front+1)%maxsize];
}
6.循环队列:为了避免元素的移动,可以将存储队列元素的一维数组首尾相接,形成一个环状,
循环队列的入队列操作语句为:
SQ.rear=(SQ.rear+1)%maxsize;SQ.data[SQ.rear]=x;
出队列操作对应的赋值语句为:
SQ.front=(SQ.front+1)%maxsize;
7.循环队列满,队列空条件
循环队列为空 CQ.rearCQ.front
循环队列为满 (CQ.rear+1)%maxsizeCQ.front