栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

队列的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

队列的实现

文章目录

什么是队列队列用数组(顺序表)还是用线性表头文件入队出队初始化打印访问队头元素访问队尾元素队列的大小销毁

什么是队列

队列:只允许在一端进行插入数据操作,另一端进行删除数据操作特殊的线性表。
他具有先进先出(FIFO)特性,进行插入的一端为队尾,进行删除的一端为队头。

队列用数组(顺序表)还是用线性表

要出队列的性质去分析,先进先出。当我们在队头删除的时候,如果用数组,明显的要挪动元素,
这样效率太低了,所以用链表更好一些。

头文件
#include
#include
#include
#include

typedef int QDataType;

typedef struct QueueNode
{
	QDataType data;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
}Queue;

// 初始化队列
void QueueInit(Queue* q);

// 队尾入队列
void QueuePush(Queue* q, QDataType data);

// 队头出队列
void QueuePop(Queue* q);

// 获取队列头部元素
QDataType QueueFront(Queue* q);

// 获取队列队尾元素
QDataType QueueBack(Queue* q);

// 获取队列中有效元素个数
int QueueSize(Queue* q);

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);

// 销毁队列
void QueueDestroy(Queue* q);

这里涉及两个结构体,画图示意一下。

入队
void QueuePush(Queue* q, QDataType x)
{
	assert(q);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		printf("malloc failn");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;

	//这里判断链表为空不能用head==tail,因为只有一个节点也是这样
	if (q->head == NULL && q->tail==NULL)
	{
		q->head = newnode;
		q->tail = newnode;
	}
	else
	{
		q->tail->next = newnode;
		q->tail = newnode;
	}
}

出队
void QueuePop(Queue* q)
{
	assert(q);
	//分为三种情况,无节点,1个节点,多个节点
	if (q->head == NULL && q->tail == NULL)
	{
		printf("NO Data to Popn");
		return;
	}
	else if (q->head == q->tail)
	{
		QNode* cur = q->head;
		free(cur);
		q->head = q->tail = NULL;
	}
	else
	{
		QNode* cur = q->head->next;
		free(q->head);
		q->head = cur;
	}
}

初始化

初始化就很简单啦

void QueueInit(Queue* q)
{
	assert(q);
	q->head = q->tail = NULL;
}
打印
void QueuePrint(Queue* q)
{
	assert(q);
	assert(q->head);
	if (q->tail == q->head)
		printf("%d ", q->head->data);
	else
	{
		QNode* cur = q->head;
		while (cur)
		{
			printf("%d ", cur->data);
			cur = cur->next;
		}
	}
	printf("n");
} 
访问队头元素
QDataType QueueFront(Queue* q)
{
	assert(q);
    assert(q->tail && q->head); //没有元素还访问啥
	return q->head->data;
}
访问队尾元素
QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(q->tail && q->head); //没有元素还访问啥
	return q->tail->data;
}
队列的大小
int QueueSize(Queue* q)
{
	assert(q);
	if (q->head == NULL && q->tail == NULL)
	{
		return 0;
	}
	else if (q->head == q->tail)
	{
		return 1;
	}
	else
	{
		int count = 0;
		QNode* cur = q->head;
		while (cur)
		{
			count++;
			cur = cur->next;
		}
		return count;
	}
}
销毁
void QueueDestroy(Queue* q)
{
	assert(q);
	assert(q->tail && q->head);

	QNode* cur = q->head;
	while (cur)
	{
		QNode* save = cur->next;
		free(cur);
		cur = save;
	}
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778919.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号