数据结构9:队列

文章目录

简介

队列是一种类似于单向隧道一样的数据结构,数据只能从一端进入,然后从另一端输出,先进入的先弹出,后进入的后弹出。

入队列:向队列中添加元素的操作叫做入队列,如图1所示。

出队列:从队列中取出元素的操作叫做出队列,如图2所示。

队列的数据结构和API函数:

我们教程中的队列是以线性表为基础实现的,因此队列的数据结构与线性表是一样的,队列的API也是在线性表的基础上实现的。队列就是只允许在最前端插入元素,在最尾端取出元素的线性表。为了简单方便,我们以单向链表为基础实现队列及其API函数。

队列的数据结构

c 复制代码
//将List类型定义为Queue
typedef List Queue;

队列生成函数:

c 复制代码
Queue *QueueCreate()
{
	//定义一个Queue类型的指针
	Queue *temp = NULL;
	//利用ListCreate给分配队列空间
	temp = (Queue *)ListCreate();
	//返回队列指针
	return temp;
}

应用代码

c 复制代码
Queue *myqueue = NULL;
//建立一个栈
myqueue = QueueCreate();

队列销毁函数:

c 复制代码
int QueueDestroy(Queue **queue)
{
	int ret;
	//利用ListDestory销毁Queue
	ret = ListDestory(queue);
	//返回操作的结果
	return ret;
}

应用代码:

c 复制代码
QueueDestroy(&myqueue);

队列清空函数:

c 复制代码
int QueueClear(Queue *queue)
{
	int ret;
	//利用ListClear清空Queue
	ret = ListClear(queue);
	//返回操作的结果
	return ret;
}

应用代码:

c 复制代码
QueueClear(&mystack);

队列长度获取函数:

c 复制代码
int QueueGetlen(Queue *queue)
{
	int ret;
	//利用ListGetLength获取队列长度
	ret = ListGetLength(queue);
	//返回队列的长度
	return ret;
}

应用代码:

c 复制代码
len = QueueGetlen(myqueue);

队列空检测函数:

c 复制代码
int QueueEmpty(Queue *queue)
{
	int len;
	//获取队列的长度
	len = QueueGetlen(queue);
	//如果长度为0,说明队列为空,返回1
	if (len == 0)
	{
		return 1;
	}
	return 0;
}

应用代码:

c 复制代码
printf("QueueEmpty:%d\n", QueueEmpty(myqueue));

队列满检测函数:

c 复制代码
int QueueFull(Queue *queue)
{
	int len;
	len = QueueGetlen(queue);
	if (len == xx)
	{
		return 1;
	}
	return 0;
}

队列满函数与队列空函数类似,也是根据长度来判断的,因为我们使用的线性表是单向链表,元素可以动态地增加,因此无法判断其何时为满;当采用的线性表为顺序表时,该函数才有意义;也可以自己设定一个最大长度,当队列内元素等于该值时,无法插入元素,从而实现队列满,本文对此不做过多阐述。

元素入队列函数:

c 复制代码
int QueueIn(Queue *queue, int data)
{
	int ret;
	//利用ListAdd在队列首部插入元素
	ret = ListAdd(queue, 0, data);
	//返回操作的结果
	return ret;
}

应用代码:

c 复制代码
for (i = 0; i < 5; i++)
{
	QueueIn(myqueue, i);
}

元素出队列函数:

c 复制代码
int QueueOut(Queue *queue)
{
	int ret;
	int data;
	//判断长度是否为空
	if (QueueEmpty(queue) == 1)
	{
		return -1;
	}
	//利用ListDelete在队列尾部取出元素
	ret = ListDelete(queue, QueueGetlen(queue) -1, &data);
	//如果操作无误,返回数据,否则返回-1
	if (ret == 0)
	{
		return data;
	}
	return -1;
}

应用代码:

c 复制代码
for (i = 0; i < 5; i++)
{
	printf("%d:%d\n", i, QueueOut(myqueue));
}
相关推荐
水饺编程1 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
linx2951 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
无忧.芙桃1 小时前
嵌入式(一):嵌入式历史与计算机基础:从 ENIAC 到 MCU 四大技术方向
c语言·单片机·嵌入式硬件·计算机
布莱克6051 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
一只旭宝1 小时前
Python 与 C/C++ 内存模型对比总结
c语言·c++·python
白色的北极熊2 小时前
c语言 输出菱形字符串
c语言·开发语言
科学实验家2 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法
T1mzhou3 小时前
ARM64 Linux 6.10 内核驱动(14):drivers/base/platform.c:板级设备主战场
linux·c语言·开发语言·arm开发
小孩玩什么3 小时前
深入理解字符串匹配算法:BF算法,KMP算法
java·c语言·开发语言·数据结构·c++·算法
clear sky .3 小时前
内存8字节对齐是什么?
c语言·stm32·嵌入式硬件