队列的定义
- 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
- 先进先出,简称FIFO。
- 队头:允许删除的一端。
- 队尾:允许插入的一端。
队列的抽象数据类型
Operation
- IntQueue(*Q):初始化操作,建立一个空队列Q。
- DestroyQueue(*Q):消除队列。
- ClearQueue(*Q):清空队列。
- QueueEmpty(Q):若队列为空,返回true。
- GetHead(Q, *e):若存在且非空,返回队列的队头元素。
- EnQueue(*Q, e):插入元素e到队列并成为队列的队尾元素。
- DeQueue(*Q, *e):删除队列中的队头元素,并用e返回。
- QueueLength(Q):返回队列Q的元素个数。
循环队列
-
队列的顺序存储结构容易造成队列的“假溢出”。遂使用循环队列。
-
循环队列:头尾相接的顺序存储结构叫做循环队列。
-
循环队列的顺序存储结构:
typedef int QElemType;
typedef struct
{
QElemType date[MAXSIZE];
int front; //头指针
int rear; //尾指针,指向队尾元素的下一个位置
}SqQueue;
- 循环队列的初始化:
int InitQueue(SqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
return 1;
}
- 循环队列的入队:
int EnQueue(SqQueue *Q, QElemType e)
{
if ((Q->rear+1)%MAXSIZE == Q->front) //队列满
return 0;
Q->data(Q->rear) = e; //将元素e赋值给队尾
Q->rear = (Q->rear+1)%MAXSIZE; //rear指针后移一位
return 1;
}
- 循环队列的出队:
int DeQueue(SqQueue *Q, QElemType *e)
{
if (Q->front == Q->rear) //队列空
return 0;
*e = Q->data(Q->front); //将队头元素赋值给e
Q->front = (Q->front+1)%MAXSIZE; //front指针后移一位
return 1;
}
队列的链式存储结构
-
只能尾进头出的单链表,也叫链队列。
-
链队列的存储结构:
typedef int QElemType;
typedef struct QNode //结点结构
{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct //队列的链表结构
{
QueuePtr front, rear;
}LinkQueue;
- 链队列的入队:
int EnQueue(LinkQueue *Q, QElemType e)
{
QueuePtr s=(QueuePtr) malloc (sizeof (QNode)); //生成一个新结点
s->data = e;
e->next = NULL;
Q->rear->next = s; //把s赋值给原队尾结点的后继
Q->rear = s; //设置当前结点为新的队尾结点
return 1;
}
- 链队列的出队:
int DeQueue(LinkQueue *Q, QElemType *e)
{
QueuePtr p;
if(Q->front == Q->rear) //队列空
return 0;
p = Q->front->next; //将队头结点暂存给p
*e = p->data; //将队头结点的值赋给e
Q->front->next = p->next; //将原队头结点的后继赋值给头结点
if(Q->rear == p) //若队头是队尾,将rear指向头结点
Q->rear = Q->front;
free(p); //释放p
return 1;
}