定义
queue是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
先进先出FIFO,允许插入的一端称为队尾,允许删除的一端称为对头
抽象数据类型
ADT Queue
Data
同线性表
Operation
InitQueue(*Q)
DestoryQueue(*Q)
ClearQueue(*Q)
QueueEmpty(Q)
GetHead(Q,*e)
EnQueue(*Q,e)
DeQueue(*Q,*e)
QueueLength(Q)
endADT
循环队列
头尾相接的顺序存储结构
一般使用第二种方法,这时又有一个问题就是:rear可能比front大也可能小,可能差了整整一圈
typedef int QElemType;
/*循环队列的顺序存储结构*/
typedef struct
{
QElemType data[MAXSIZE];
int front;/*头指针*/
int rear;/*尾指针,若队列不空,则指向队尾元素的下一个位置*/
}SqQueue;
/*初始化*/
Status InitQueue(SqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
return OK;
}
/*返回元素个数*/
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
/*出队*/
Status EnQueue(SqQueue *Q, QElemType *e)
{
if(Q->front == Q->rear) /*空*/
return ERROR;
*e = Q->data[Q->front];
Q->front = ( Q->front + 1 ) % MAXSIZE;
return OK;
}
链式存储结构(链队列)
#include <malloc.h>
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct
{
QueuePtr front, rear;
}LinkQueue;
/*入队*/
Status EnQueue(LinkQueue *Q, QElemType e)
{
QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
s->data = e;
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
return OK;
}
/*出队*/
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;
}