Queue概念
队列是一种特殊的线性表,其中只允许在固定的一端进行插入数据,在另一端进行数据的删除。遵循FIFO(first in first out)原则。进行插入操作的一端称为队尾,进行删除操作的一端称为队头。
Queue实现
Queue.h文件
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int QDataType;
//链式结构:表示队列
typedef struct QueueNode
{
QDataType data;
struct QListNode* next;
}QueueNode;
//队列的结构
typedef struct Queue
{
QueueNode* front;
QueueNode* rear;
}Queue;
//队列的初始化
void QueueInit(Queue* pq);
//入队操作
void QueuePush(Queue* pq, QDataType data);
//出队操作
void QueuePop(Queue* pq);
//获取队列头元素
QDataType QueueFront(Queue* pq);
//获取队列尾元素
QDataType QueueBack(Queue* pq);
//获取队列中有效元素个数
int QueueSize(Queue* pq);
//队列判空
int QueueEmpty(Queue* pq);
//队列销毁
void QueueDestory(Queue* pq);
Queue.c文件
#include "Queue.h"
//队列的初始化
void QueueInit(Queue* pq)
{
assert(pq);
pq->front = pq->rear = NULL;
}
//入队操作
void QueuePush(Queue* pq, QDataType x)
{
assert(pq);
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
newnode->data = x;
newnode->next = NULL;
if (pq->rear == NULL)
{
pq->front = pq->rear = newnode;
}
else
{
pq->rear->next = newnode;
pq->rear = newnode;
}
}
//出队操作
void QueuePop(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
//1.只有一个节点
//2.有多个节点
if (pq->front == pq->rear)
{
free(pq->front);
pq->front = pq->rear = NULL;
}
else
{
QueueNode* next = pq->front->next;
free(pq->front);
pq->front = next;
}
}
//获取队列头元素
QDataType QueueFront(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->front->data;
}
//获取队列尾元素
QDataType QueueBack(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->rear->data;
}
//获取队列中有效元素个数
int QueueSize(Queue* pq)
{
assert(pq);
int size = 0;
QueueNode* cur = pq->front;
while (cur)
{
size++;
cur = cur->next;
}
return size;
}
//队列判空
int QueueEmpty(Queue* pq)
{
assert(pq);
return pq->front == NULL ? 1 : 0;
}
//队列销毁
void QueueDestory(Queue* pq)
{
assert(pq);
QueueNode* cur = pq->front;
while (cur)
{
QueueNode* next = cur->next;
free(cur);
cur = next;
}
pq->front = pq->rear = NULL;
}
Test.c文件
#include "Queue.h"
int main()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 5);
while (!QueueEmpty(&q))
{
int front = QueueFront(&q);
QueuePop(&q);
printf("%d ", front);
}
printf("\n");
QueueDestory(&q);
return 0;
}