基本概念
- **队列:**是一种先进先出的线性表(FIFO)。
- 队列只允许在一端添加元素,另一端删除元素。一般将添加元素的一端称为队尾;删除元素的一端称为队头。
- 链队列是指用链表表示的队列。一个链队列需要两个分别指向队头和队尾的指针才能唯一确定。
存储结构
链队列对应的存储结构和基本操作说明:
#ifndef LINKHEAD_H_INCLUDED
#define LINKHEAD_H_INCLUDED
//链队列存储结构和基本操作说明
typedef int ElemType;
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct {
QueuePtr fr; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
//构造空队列
void Init_Queue(LinkQueue &Q);
//销毁队列
void Destroy_Queue(LinkQueue &Q);
//清空队列
void Clear_Queue(LinkQueue &Q);
//判断是否为空队列
bool isEmpty(LinkQueue Q);
//返回队列长度
int Queue_Length(LinkQueue Q);
//返回队头元素
void GetHead(LinkQueue Q, ElemType &e);
//在队尾插入元素
void EnQueue(LinkQueue &Q, ElemType e);
//在队头取出元素
void DeQueue(LinkQueue &Q, ElemType &e);
//打印队列
void showup(LinkQueue Q);
#endif // LINKHEAD_H_INCLUDED
实现
- 队列初始化
//构造空队列
void Init_Queue(LinkQueue &Q)
{
Q.fr = (QueuePtr)malloc(sizeof(QNode));
if(!Q.fr) return;
Q.rear = Q.fr;
Q.fr->next = NULL;
return;
}
- 清空队列
//清空队列
void Clear_Queue(LinkQueue &Q)
{
while(Q.fr != Q.rear){
QueuePtr p = Q.fr->next;
Q.fr = Q.fr->next;
free(p);
}
Q.fr = NULL;
Q.rear = Q.fr;
}
- 入队列
//在队尾插入元素
void EnQueue(LinkQueue &Q, ElemType e)
{
QueuePtr p = (QueuePtr) malloc(sizeof(QNode));
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
- 出队列
//在队头取出元素
void DeQueue(LinkQueue &Q, ElemType &e)
{
if(isEmpty(Q)){
printf("队列为空,无队头元素\n");
return;
}
QueuePtr p = Q.fr->next;
Q.fr->next = p->next;
e = p->data;
if(Q.rear == p) Q.rear = Q.fr;
free(p);
}