队列
ADT
ADT 队列(Queue)
Data
同线性表。元素具有相同的类型,相邻元素具有前去和后继关系。
Operation
InitQueue(*Q): 初始化,建立一个空队Q
DestroyQueue(*Q):销毁队Q
ClearQueue(*Q):清空队Q
QueueEmpty(Q):判空
GetHead(Q,*e):用e返回队头
EnQueue(*Q,e):入队
DeQueue(*Q,*e):出队
QueueLength(Q):返回队长
endADT
循环队列
- 【假溢出】:普通顺序存储结构的队列,队满但头前有空位
- 【循环队列】:头尾相接的顺序存储队列
- 队空:front == rear
- 队满:(rear+1)%QueueSize == front
- 队长:(rear-front+QueueSize)%QueueSize
存储结构
typedef int QElemType;
typedef struct{
QELemType data[MAXSIZE];
int front;
int rear;
}SqQueue;
InitQueue
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
Status InitQueue(SqQueue *Q){
Q->front=0;
Q->rear=0;
return OK;
}
QueueLength
int QueueLength(SqQueue Q){
return (rear-front+QueueSize)%QueueSize;
}
EnQueue
Status EnQueue(SqQueue *Q, QElemType e){
if((Q->rear+1)%MAXSIZE == Q->front)
return ERROR;
Q->data[Q->rear]=e;
Q->rear=(Q->raer+1)%MAXSIZE;
return OK;
}
DeQueue
Status DeQueue(SqQueue *Q, QElemType *e){
if(Q->front == Q->rear)
return ERROR;
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return OK;
}
链队
存储结构
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{
QueuePtr front, rear;
}LinkQueue;
InitQueue
void InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if( !Q->front )
exit(0);
Q->front->next = NULL;
}
EnQueue
Status EnQueue(LinkQueue *Q, QElemType){
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
if(!s)
exit(OVERFLOW);
s->data=e;
s->next=NULL;
Q->rear->next=s;
Q->rear=s
DeQueue
Status DeQueue(LinkQueue *Q, QElemType *e){
QueuePtr p;
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;
}
DestroyQueue
void DestroyQueue(LinkQueue *Q)
{
while( Q->front ) {
Q->rear = Q->front->next;
free( Q->front );
Q->front = Q->rear;
}
}