队列也是一种特殊的数据结构,原则是先进先出(FIFO)。只允许在一端插入,称为“队尾”,在另一端删除,称为“队头”。
队列可以用数组、链表实现,但是用链表实现更优。以下就是使用链表实现的。
Queue.h
#pragma once
#include "Commen.h"
//队列-->单链表实现
typedef int QDataType;
typedef struct QueueNode//节点结构
{
QDataType _data;
struct QueueNode* _next;
}QueueNode;
typedef struct Queue//队列
{
QueueNode* _front;//指向队头
QueueNode* _rear;//指向队尾
}Queue;
void QueueInit(Queue* q);
void QueueDestory(Queue* q);
void QueuePush(Queue* q, QDataType x);//在队尾插入
void QueuePop(Queue* q);//在队头删除
int QueueSize(Queue* q);
int QueueEmpty(Queue* q);
QDataType QueueFront(Queue* q);//取队头数据
QDataType QueueBack(Queue* q);//取队尾数据
void QueueTest();
Queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
void QueueInit(Queue* q)
{
assert(q!=NULL);
q->_front = q->_rear = NULL;
}
void QueueDestory(Queue* q)
{
assert(q != NULL);
QueueNode* cur = q->_front;//cur指向队列第一个元素节点
while (cur)
{
QueueNode* next = cur->_next;
free(cur);
cur = next;
}
q->_front = q->_rear = NULL;
}
//申请一个节点
QueueNode* BuyNewNode(QDataType x)
{
QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode));
node->_data = x;
node->_next = NULL;
return node;
}
void QueuePush(Queue* q, QDataType x)//在队尾插入
{
assert(q != NULL);
//原来有元素、原来没有元素,两种情况
if (q->_front == NULL)
{
q->_front = q->_rear = BuyNewNode(x);
}
else
{
q->_rear->_next = BuyNewNode(x);
q->_rear = q->_rear->_next;
}
}
void QueuePop(Queue* q)//在队头删除
{
assert(q != NULL);
if (q->_front)//非空
{
QueueNode* next = q->_front->_next;
free(q->_front);
q->_front = next;
if (q->_front == NULL)//如果删完没有元素了,要将队尾指针置空,防止“野指针”
{
q->_rear = NULL;
}
}
}
int QueueSize(Queue* q)
{
assert(q != NULL);
int size = 0;
QueueNode* cur = q->_front;
while (cur)
{
size++;
cur = cur->_next;
}
return size;
}
int QueueEmpty(Queue* q)
{
assert(q != NULL);
return q->_front == NULL ? 0 : 1;
}
QDataType QueueFront(Queue* q)//取队头数据
{
assert(q != NULL);
return q->_front->_data;
}
QDataType QueueBack(Queue* q)//取队尾数据
{
assert(q != NULL);
return q->_rear->_data;
}
void QueueTest()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
while (QueueEmpty(&q))
{
printf("front:%d\n", QueueFront(&q));//打印队头元素
QueuePop(&q);//删除队头
}
}