数据结构:队列
队列:Queue
特点:先进先出,堆存储
【适合:头部取出,尾部添加】
允许在表的前端(front)进行删除操作
而在表的后端(rear)进行插入操作
先进先出(FIFO—first in first out)线性表
必须为其静态分配或动态申请一片连续的存储空间
并设置两个指针进行管理。
一个是队头指针front,它指向队头元素;
另一个是队尾指针rear,它指向下一个入队元素的存储位置
头文件
#pragma once
#include <stdio.h>
#include <malloc.h>
typedef int QuDataType;
// 链式结构:表示队列
typedef struct QListNode
{
struct QListNode* _next;
QuDataType _data;
}QueueNode;
// 队列的结构
typedef struct Queue
{
QueueNode* _front;
QueueNode* _rear;
}Queue;
// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QuDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QuDataType QueueFront(Queue* q);
// 获取队列队尾元素
QuDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);
实现
#include "Queue.h"
//一个数据入队列必须要先创建节点
QueueNode * BuyQueueNode(QuDataType x) //创建节点并初始化此节点
{
QueueNode * cur = (QueueNode *)malloc(sizeof(QueueNode));
cur->_data = x;
cur->_next = NULL;
return cur;
}
void QueueInit(Queue* q) //初始化队列结构
{
q->_front = NULL;
q->_rear = NULL;
}
void QueuePush(Queue* q, QuDataType x) //队列尾部入数据
{
QueueNode * cur = BuyQueueNode(x); //先把创建好的节点传过来
if (q->_front == NULL) //若是队列本身为空,队列里就只有这一个节点,又为队列头又为队列尾
{
q->_front = q->_rear = cur;
}
else
{
q->_rear->_next = cur; //否则,链表尾插操作
q->_rear = cur;
}
}
void QueuePop(Queue* q) //队列头部出数据
{
if (q->_front == NULL) //本身队列为空,不做操作
{
return;
}
QueueNode* tmp = q->_front->_next; //先保留下一个节点,防止断链
free(q->_front);
q->_front = tmp; //更新对列头部
}
QuDataType QueueFront(Queue* q) //获取队列首部元素
{
return q->_front->_data;
}
QuDataType QueueBack(Queue* q)//获取队列尾部元素
{
return q->_rear->_data;
}
int QueueEmpty(Queue* q) //判断队列是否为空
{
return q->_front == NULL; //为空,返回1
}
int QueueSize(Queue* q) //获取队列中的元素个数
{
QueueNode * cur;
int count = 0;
for (cur = q->_front; cur; cur = cur->_next)//循环遍历,计数即可
{
count++;
}
return count;
}
void QueueDestory(Queue* q) //销毁队列
{
if (q->_front == NULL)
{
return;
}
while (q->_front)
{
QueuePop(q);//对每一个元素迭代出队即可
}
}