浅谈队列(Queue)的实现

文章目录

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43580319/article/details/114503191