线性结构(五)队列及代码实现

news/2024/10/7 20:36:07 标签: 数据结构

系列文章目录

线性结构(一)顺序表及其代码实现
线性结构(二)单链表及其代码实现
线性结构(三)头结点的循环双链表
线性结构(四)栈及其代码实现及OJ题
线性结构(五)队列及代码实现


目录

  • 系列文章目录
  • 前言
  • 1.前言
    • 1.1 队列介绍
    • 1.2 代码实现
  • 总结

前言


1.前言

1.1 队列介绍

队列也是一种线性结构,队列要求,队尾插入元素,队头删除元素。所以队列元素是“First In First Out”,也即FIFO.
由于队列只能在队头删除,队尾插入,那么记录尾指针效率更高;因此要记录头指针、尾指针、数据元素个数,多个数据我们考虑存在结构体中,因此要定义新的结构体代表队列。这种情况下,求队列长度无需遍历,时间复杂度为O(1),无独有偶,单链表也可以这样处理,记录头指针和size,存在数据结构中,代表单链表。求单链表长度无需遍历,时间复杂度为O(1).
还有双向带头循环链表,或许有的小伙伴考虑头结点存储链表长度,但是如果链表数据类型是char,链表长度>127就溢出(溢出不等于截断,打个比方,截断是int赋给char,char存不下)了。再者,如果类型是double呢,链表长度为浮点数?好生奇怪。

1.2 代码实现

Queue.h

#pragma once
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <stdbool.h>
typedef int QDataType;
typedef	struct QueueNode//代表队列的一个结点
{
	QDataType data;
	struct QueueNode* next;
}QNode;
typedef	struct Queue//代表队列
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
bool QueueEmpty(Queue* pq);
void QueuePush(Queue* pq,QDataType x);
void QueuePop(Queue* pq);
int QueueSize(Queue* pq);
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);

Queue.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
	pq->size = 0;
}
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->head,*next=NULL;
	while (cur)
	{
		next= cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0;
}
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc failed");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;

	if (pq->head == NULL)
	{
		assert(pq->tail==NULL);
		pq->tail = pq->head = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->head!=NULL);
	/*QNode* next = pq->head->next;
	free(pq->head);
	pq->head = next;
	if (pq->head == NULL)
		pq->tail = NULL;*/
	if (pq->head->next == NULL)//只剩一个元素时,尾删要置尾指针为NULL.
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
	pq->size--;
}
int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->head->data;
}
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->tail->data;
}

Test.c

#include "Queue.h"
int main()
{
	Queue q;
	QueueInit(&q);
	for(int i=0;i<5;i++)
		QueuePush(&q, i + 1);
	printf("%d\n", QueueBack(&q));
	while (!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);//队列的性质,一边出队,一边访问队头元素
	}
	printf("%d\n", QueueSize(&q));
	
	QueueDestroy(&q);
	return 0;
}

总结

队列在队尾入队,队头出队。一个很新的点就是,除定义表示结点的结构体之外,还定义表示队列的结构体,这也能运用到单链表中,但用头结点存储链表元素个数不可取。


http://www.niftyadmin.cn/n/5693342.html

相关文章

GeoCue与Xer Technologies合作推动无人机测绘技术革新

GeoCue与Xer Technologies合作推动无人机测绘技术革新 近期,LiDAR测绘硬件和软件开发商GeoCue与瑞士长航时混合动力无人机制造商Xer Technologies AG携手合作,成功将GeoCue的TrueView 720 LiDAR和图像传感器集成至Xer X8无人机平台。这一里程碑式的合作不仅标志着无人机测绘技…

YOLO11改进|卷积篇|引入SPDConv

目录 一、【SPD】卷积1.1【SPD】卷积介绍1.2【SPD】核心代码 二、添加【SPD】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SPD】卷积 1.1【SPD】卷积介绍 SPD-Conv卷积的结构图如下&#xff0c;下面我们简单分析一下其处理过程…

pytest(六)——allure-pytest的基础使用

前言 一、allure-pytest的基础使用 二、需要掌握的allure特性 2.1 Allure报告结构 2.2 Environment 2.3 Categories 2.4 Flaky test 三、allure的特性&#xff0c;allure.step()、allure.attach的详细使用 3.1 allure.step 3.2 allure.attach&#xff08;挺有用的&a…

【网络】web1.0 2.0 3.0各自出现背景/技术原理/演化发展过程,以及Web 3.0 对传统互联网的影响

一、web1.0 2.0 3.0各自出现背景/技术原理/演化发展过程 互联网自诞生以来&#xff0c;经历了三个主要的发展阶段&#xff1a;Web 1.0、Web 2.0 和 Web 3.0&#xff0c;每个阶段都有其独特的特点和影响。 1、Web 1.0 Web 1.0 是互联网的初始阶段&#xff0c;大约从1990年代到…

面试--开源框架面试题集合

Spring 谈谈自己对于 Spring IoC 的了解什么是 IoC?IoC 解决了什么问题?什么是 Spring Bean&#xff1f;将一个类声明为 Bean 的注解有哪些?Component 和 Bean 的区别是什么&#xff1f;注入 Bean 的注解有哪些&#xff1f;Autowired 和 Resource 的区别是什么&#xff1f;…

JavaScript的作用域闭包

1. 什么是闭包 先说结论&#xff1a;当函数可以记住并访问所在的词法作用域变量时&#xff0c;就产生了闭包&#xff0c;即使函数是在当前词法作用域之外执行。 思考以下代码&#xff1a; function foo() {var a 2;function bar() {console.log(a);}bar(); } foo();函数bar可…

快速熟悉Nginx

一、Nginx是什么&#xff1f; ‌Nginx是一款高性能、轻量级的Web服务器和反向代理服务器。‌ ‌特点‌&#xff1a;Nginx采用事件驱动的异步非阻塞处理框架&#xff0c;内存占用少&#xff0c;并发能力强&#xff0c;资源消耗低。‌功能‌&#xff1a;Nginx主要用作静态文件服…

【AI大模型-文心-思维树解读-仓颉精通之路-11】

提问&#xff1a;你还记得我们设置过一个暗号吗&#xff1f;仓颉精通之路 回答&#xff1a;如下 版本&#xff1a;文心大模型3.5 是的&#xff0c;我记得我们之前设置过的“暗号”是“仓颉精通之路”。这个“暗号”可以被视为一个象征性的口号或指引&#xff0c;代表着我们在追…