栈
定义:栈是限定仅在表尾进行插入或删除操作的线性表,表尾端称为栈顶,表尾端称为栈顶,表头端称为栈底,后进先出(Last In First Out)
抽象数据类型定义
1 | ADT Stack{ |
数据结构:
1 |
|
栈的基本运算
①构造空栈 -- S.base=(SElemType)malloc(STACK_INIT_SIZE*sizeof(SElemType));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
②判定栈空 -- S.top==S.base
③判定栈满 -- S.top-S.base==S.stacksize
④进 栈 -- * S.top++=e
⑤出 栈 -- e= –S.top
⑥取 栈 顶 -- e=* (S.top-1)
注意:
上溢:S.top-S.base>=S.stacksize
下溢:栈空
图示:
队列
定义:队列是一种先进先出(First In First Out)的线性表,只允许一端进行插入,另一端删除元素,允许插入的一端称为队尾,允许删除的一端称为队头
抽象数据类型
ADT Queue{
数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥n}
数据关系:Rl={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}
基本操作:
InitQueue(&Q)
操作结果:构造一个空队列Q
DestroyQueue(&Q)
初始条件:队列Q已存在
操作结果:队列Q被销毁,不再存在
ClearQueue(Q)
初始条件:队列Q已存在
操作结果:将Q清为空队列
QueueEmpty(Q)
初始条件:队列Q已存在
操作结果:若Q为空队列,则返回true,fouze false
QueueLength(Q)
初始条件:队列Q已存在
操作结果:返回Q的元素个数,即队列的长度
GetHead(Q,&e)
初始条件:Q为非空队列
操作结果:用e返回Q的队头元素
EnQueue(&Q,e)
初始条件:队列Q存在
操作结果:插入元素e为Q的新的队尾元素
DeQueue(&Q,&e)
初始条件:Q为非空队列
操作结果:删除Q的队头元素,并用e返回其值
QueueTraverse(Q,visit())
初始条件:Q已存在且非空
操作结果:从队头到队尾,依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败
}ADT Queue
1.单链队列:
1 | typedef struct QNode{ |
图示:
基本操作:
入队:
1 | p=(QueuePtr)malloc(sizeof(QNode) |
出队:
1 | p=Q.front->next; |
2.循环队列——顺序表示和实现
判定队列“空”或“满”
①设置一个标志位
②少用一个元素空间
空:Q.front==Q.rear
满:(Q.rear+1)%MAXQSIZE==Q.front
数据结构:
1 |
|
图示:
队列的基本操作:
入队:
1 | if((Q.rear+1)%MAXQSIZE)==Q.front) return ERROR; //队列满 |
出队:
1 | if(Q.front==Q.rear) return ERROR |
栈代码
1 |
|
队列代码
1 |
|