队列(FIFO)
一种特殊的线性表,限定在队头删除在队尾插入。
-
ADT Queue{
数据对象:D={ai|ai∈ELemSet,i=1,2,…n,n>=0}
数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=2,…n}
基本操作:
InitQueue(&Q); //构造一个空队列
DestroyQueue(&Q); //销毁队列
ClearQueue(&Q); //将队列清空
QueueEmpty(Q); //判断队列是否为空队列
QueueLength(Q); //返回队列的长度
GetHead(Q,&e); //返回队头元素
EnQueue(&Q,e); //在队尾插入新元素
DeQueue(&Q,&e); //删除队首元素
}//ADT Queue
-实现
-队列的链式表示
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
-初始化队列
status InitQueue(LinkQueue &Q){
Q.front=Q.rear=new QNode;
if(!Q.front) return ERROR;
Q.front->next=null;
return Ok;
}//InitQueue
-入队
status EnQueue(LinkQueue &Q,QElemType e){
p=new QNode;
if(!p) return ERROR;
if(Q.front==Q.rear) Q.front->next=p;
p->data=e;p->next=null;
Q.rear->next=P;
Q.rear=p;
return Ok;
}//EnQueue
-出队
status DeQueue(LinkQueue &Q,QElemType &e){
if(Q.front==Q.rear) return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return Ok;
}//DeQueue
-队列的顺序表示
-假溢出:当元素被插入到数组中下标最大的位置上之后,尽管此时数组的低端还有空闲空间,但不能再有入队操作了,这种现象叫做假溢出。
-循环队列:将存储队列的数组头尾相接。用求mod的方式确定位置。
-队空:front=rear; 队满(修改版):浪费一个元素空间(rear+1)%MaxSize==front;使用计数器;设置一个bool变量。
-循环队列中的元素个数的计算:当rear>=front,rear-front;当rear<front,rear-front+队列容量;
或使用公式 L=(容量+rear-front)%容量
约定rear指向队尾元素的后一位置,front指向队头元素。
const MAXQUEUE=100;
typedef struct{
QELemType Data[MAXQUEUE];
int front,rear;
}Queue;