一、概念与结构
概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO (First In First Out) 的特点。
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
二、队列的实现
项目创建的时候,要创建一个头文件(.h)Queue.h ,两个源文件(.c)Queue.c ,test.c 。Queue.h 用于定义结构体和声明函数;Queue.c 用于实现函数;test.c 用于测试函数,每实现一个函数要进行相应的测试。编写代码过程中要勤测试,避免写出大量代码后再测试,如果出现问题,问题无从定位。
1、Queue.h
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
//定义结点的结构
typedef int DataType;
typedef struct QueueNode
{
DataType* data;
struct QueueNode* next;
}QueueNode;
//定义队列的结构
typedef struct Queue
{
QueueNode* phead;
QueueNode* ptail;
int size;
}Queue;
//初始化队列
void Init_Queue(Queue* pq);
//判断队列是否为空
bool Empty_Queue(Queue* pq);
//销毁队列
void Destory_Queue(Queue* pq);
//入队—队尾入
void Push_Queue(Queue* pq, DataType x);
//出队—队头出
void Pop_Queue(Queue* pq);
//取队头数据
DataType Get_Head_Queue(Queue* pq);
//取队尾数据
DataType Get_Tail_Queue(Queue* pq);
//求队列有效元素个数
int Size_Queue(Queue* pq);
2、Queue.c
#include"Queue.h"
//初始化队列
void Init_Queue(Queue* pq)
{
assert(pq);
pq->phead = pq->ptail = NULL;
pq->size = 0;
}
//判断队列是否为空
bool Empty_Queue(Queue* pq)
{
assert(pq);
return pq->phead == NULL;
}
//销毁队列
void Destory_Queue(Queue* pq)
{
assert(pq);
QueueNode* pcur = pq->phead;
while (pcur)
{
QueueNode* next = pcur->next;
free(pcur);
pcur = NULL;
pcur = next;
}
pq->phead = pq->ptail = NULL;
pq->size = 0;
}
//入队列—队尾入
void Push_Queue(Queue* pq, DataType x)
{
assert(pq);
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
if (!newnode)
{
perror("malloc fail!");
exit(1);
}
newnode->data = x;
newnode->next = NULL;
//若队列为空
if (!pq->phead)
{
pq->phead = pq->ptail = newnode;
}
//队列不为空
else
{
pq->ptail->next = newnode;
pq->ptail = pq->ptail->next;
}
pq->size++;
}
//出队—队头出
void Pop_Queue(Queue* pq)
{
assert(!Empty_Queue(pq));
//只有一个结点的情况
if (pq->phead == pq->ptail)
{
free(pq->phead);
pq->phead = pq->ptail = NULL;
}
//两个及以上的结点
else
{
QueueNode* next = pq->phead->next;
free(pq->phead);
pq->phead = next;
}
pq->size--;
}
//取队头数据
DataType Get_Head_Queue(Queue* pq)
{
assert(!Empty_Queue(pq));
return pq->phead->data;
}
//取队尾数据
DataType Get_Tail_Queue(Queue* pq)
{
assert(!Empty_Queue(pq));
return pq->ptail->data;
}
//求队列有效元素个数
int Size_Queue(Queue* pq)
{
return pq->size;
}
test.c自行测试,这里不予提供。