1.什么是队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(tail)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队尾进入队头出列
二、 队列的实现
1.1头文件包含的标准库
#include <stdio.h>
#include<assert.h>
#include <stdlib.h>
1.2. 定义结构体
typedef int QDataType;
typedef struct QListNode //链式结构,表示队列
{
struct QNode* next; //储存下一个结点地址
QDataType data; //储存数据
}QNode;
typedef struct Queue //队列结构
{
QNode* head;//储存头节点地址
QNode* tail;//储存尾结点地址
int size;
}Queue;
1.3. 函数声明
void QueueInit(Queue*ps);//队列的初始化
void QueuePush(Queue* ps, QDataType x);// 队尾入队列
void QueuePop(Queue* ps);// 队头出队列
QDataType QueueHead(Queue* ps);// 获取队列头部元素
QDataType Queuetail(Queue* ps);// 获取队列队尾元素
int QueueSize(Queue* ps);// 获取队列中有效元素个数
void QueueDestory(Queue* ps);//队列销毁
2.1 队列的初始化
void QueueInit(Queue* ps)
{
assert(ps);
ps->head = ps->tail = NULL;
ps->size = 0;
}
2.2 队尾入队列
void QueuePush(Queue* ps, QDataType x)
{
assert(ps);
//创建一个新的结点
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
printf("malloc fail\n");
exit(-1);
}
newnode->data = x ;
newnode->next = NULL;//开辟一个新节点存储数据
if (ps->tail == NULL)
{
assert(ps->head==NULL);
ps->head = ps->tail = newnode;
ps->size++;
}
else
{
ps->tail->next = newnode;
ps->tail = newnode;
ps->size++;
}
}
2.3 队头出队列
void QueuePop(Queue* ps)
{
assert(ps);
assert(ps->head && ps->tail);
if (ps->head->next== NULL)
{
free(ps->head);
ps->head = ps->tail = NULL;
ps->size--;
}
else
{
QNode* newnode= ps->head->next;
free(ps->head);
ps->head = newnode;
}
}
2.4 获取队列头部元素或尾部元素
QDataType QueueHead(Queue* ps)
{
assert(ps);
assert(ps->head);
return ps->head->data;
}
QDataType Queuetail(Queue* ps)
{
assert(ps);
assert(ps->tail);
return ps->tail->data;
}
2.5 获取队列中有效元素个数
int QueueSize(Queue* ps)
{
assert(ps);
assert(ps->tail);
return ps->size;
}
2.6 队列的销毁
void QueueDestory(Queue* ps)
{
assert(ps); //防止pq为空指针
QNode* cur = ps->head;
while (cur)
{
QNode* next = cur->next;
free(cur);
cur = next;
}
ps->tail = ps->head = NULL;
}