1,队列
队列::具有一定操作约束的线性表
插入与删除操作:只能在一端插入,而在另一端删除
- 数据插入: 入队列
- 数据删除:出队列
- 先来先服务
- 先进先出:FIFO
1.1队列的抽象数据描述
类型名称:队列
数据对象集:一个有0个或多个元素的有穷线性表
操作集:长度为MaxSize的队列Q,队列元素item
1,生成长度为MaxSize的空队列 2,判断队列Q是否已满 3,将数据元素item插入队列中 4,判断队列Q是否为空 5,将队头数据从队列中删除并返回
1.2队列的顺序实现
队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及记录队列尾元素位置的变量rear组成。
struct QNode {
int QArray[MAXSIZE];
int front; //队列首元素的前一个下标
int rear; //队列最后一个元素的下标
};
typedef struct QNode* Queue;
//创建队列(顺环队列),只放n-1个元素,还可以通过标记的方法将之放满
Queue createQueue()
{
Queue queue = (Queue)malloc(sizeof(struct QNode));
queue->front = 0;
queue->rear = 0;
return queue;
}
//判断队列是否已满
int IsFull(Queue queue)
{
if ((queue->rear+1)%MAXSIZE ==queue->front)
{
return 1; //队列已满
}
return 0;
}
//判断队列是否为空
int IsEmpty(Queue queue)
{
if (queue->front == queue->rear)
{
return 1; //队列为空
}
return 0;
}
//将元素插入队列
void InsertQueue(Queue queue,int data)
{
if (IsFull(queue))
{
printf("队列已满,无法插入!\n");
return;
}
queue->rear = (queue->rear+1)%MAXSIZE;
queue->QArray[queue->rear] = data;
}
//出队列
int popQueue(Queue queue)
{
if (IsEmpty(queue))
{
printf("队列为空,错误!\n");
return errno;
}
queue->front = (queue->front + 1) % MAXSIZE;
return queue->QArray[queue->front];
}
1.3队列的链式存储实现
队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行:队列指针front和rear,front指向链表头,rear指向队列尾。
//结点
struct Node {
int data;
struct Node* pNext;
};
//队列结点
struct QNode {
struct Node* front;
struct Node* rear;
};
typedef struct QNode* Queue;
//创建队列
Queue createQueue()
{
Queue queue = (Queue)malloc(sizeof(struct QNode));
queue->front = NULL;
queue->rear = NULL;
return queue;
}
//创建结点
struct Node* createNode(int data)
{
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->pNext = NULL;
node->data = data;
}
//判断队列是否为空
int IsEmpty(Queue queue)
{
if (queue->front == NULL)
{
return 1;
}
return 0;
}
//插入队列元素,入队
void insertQue(Queue queue, int data)
{
if (IsEmpty(queue))
{
struct Node* headNode = createNode(data);
queue->front = headNode;
queue->rear = headNode;
return;
}
struct Node* node = createNode(data);
queue->rear->pNext = node;
queue->rear = queue->rear->pNext;
}
//出队
int popQueue(Queue queue)
{
if (IsEmpty(queue))
{
printf("队列为空!\n");
return errno;
}
struct Node* temp = queue->front;
int number = temp->data;
queue->front = temp->pNext;
free(temp);
return number;
}
注意释放开辟的空间!
- 释放队列
//释放队列
void FreeQue(Queue queue)
{
while (queue->front)
{
struct Node* temp = queue->front;
queue->front = queue->front->pNext;
free(temp);
temp = NULL;
}
}