首页 > 其他分享 >数据结构之队列

数据结构之队列

时间:2023-05-28 17:01:31浏览次数:43  
标签:assert head pq 队列 Queue tail 数据结构

@TOC


前言

本文章讲述的是数据结构的特殊线性表——队列


一.什么是队列,队列的特点

队列是数据结构中的一种特殊的线性表,它与栈不同,

数据结构之队列_链表

队列的基本图例如上图: 显然,队列的特点就是:

先进先出First In First Out

那么我们使用什么样的方式来实现队列呢?

基于队列的特点,使用链表而不是数组来实现队列是比较合适的 使用数组来实现队列的缺点:

出队时需要挪动数据,效率不高。

使用链表来实现队列的优点:入队出队效率高,不需要挪动数据。 使用链表来进行入队出队时,就需要链接起来和释放节点,所以我们最好定义头指针和尾指针指向队头和队尾。

把头指针和尾指针放在一个结构体中,更方便操作,如下图:

数据结构之队列_链表_02

二、队列相关操作

队列的相关操作声明

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

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

void QueuePush(Queue* pq,QDataType x);//插入数据

void QueuePop(Queue* pq);//删除数据

int QueueSize(Queue* pq);//记录队列有多少人

bool QueueEmpty(Queue* pq);//判断队列是否为NULL

QDataType QueueFront(Queue* pq);//取出队头数据

QDataType QueueBack(Queue* pq);//取出队尾数据

队列的创建

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int QDataType;
//队列更适合用链表写,因为如果用顺序表来写,出列的时候需要挪动数据

typedef struct QueueNode
{
	QDataType data;
	struct QueueNode* next;
}QNode;
//队伍的每个人的结构体

typedef struct Queue
{
	struct QueueNode* head;
	struct QueueNode* tail;
}Queue;
指向队头和队尾的两个指针放在一个结构体里面

1.队列的初始化

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
}

初始化指向队头和队尾的两个指针为NULL

2.对队列进行销毁

void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
}

3.判断队列是否为空队列

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

4.入队操作

解读:队列的实现方式是链表,不需要检查容量不足,每入队一个人就申请一个节点即可

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	assert(newnode != NULL);
	newnode->data = x;
	newnode->next = NULL;

	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	//第一次入队的时候,就作为队头,头指针指向它
	pq->tail->next = newnode;
	pq->tail = newnode;

}

5.出队操作

//记住队列是先进先出,所以队头先出
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));//队头为空,说明删完了
	QNode* newhead = pq->head->next;//先记录队头的下一个人
	
	//删到最后的时候,tail没有置空,是野指针,所以这里要判断
	if (newhead == NULL)
	{
		pq->tail = NULL;
	}

	free(pq->head);
	pq->head = newhead;
}

6.取出队头数据

注意出队的时候,并没有拿出该人数的节点的值

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->head->data;
}

7. 取出队尾数据

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->tail->data;
}

8.计算队伍的人数

int QueueSize(Queue* pq)
{
	assert(pq);
	int size = 0;
	QNode* cur = pq->head;
	while (cur)
	{
		++size;
		cur = cur->next;
	}
	return size;
}

总结

文章讲述简单队列的实现,复杂队列后续会讲。

标签:assert,head,pq,队列,Queue,tail,数据结构
From: https://blog.51cto.com/u_15818575/6365565

相关文章

  • 代码随想录Day11|栈和队列
    20.有效的括号经典的利用栈的题目这里选择用java来写,注意我们的java中的泛型不能用基本数据类型,而是应该使用包装类注意!java一定是定义后需要声明,然后才能使用1047.删除字符串中的所有相邻重复项 略比较简单150.逆波兰表达式求值注意:leetcode内置jdk的问题,不能使......
  • 优先级队列的实现详解( Java 实现)
    前言优先级队列是在队列的基础上,每个元素都带有一个优先级,可以实现按照优先级高低进行存储和访问。Java提供了许多实现优先级队列的方法,例如使用堆来实现。在本篇博客中,我将介绍Java实现优先级队列实现的具体方法,以及如何使用它来解决实际问题。一、优先级队列的概念优先级队列......
  • 王道数据结构算法实现
    一、线性表1.顺序表#include<stdlib.h>#include<stdio.h>#include<iostream>usingnamespacestd;#defineInitSize10//定义最大长度静态分配//typedefstruct{// intdata[InitList];// intlength;//}SqlList;//动态分配typedefstruct{ int*data......
  • 数据结构之——栈
    @TOC前言本文主要讲述特殊的线性表——栈:栈是什么,栈的特点数据结构中有一种特殊的线性表叫栈。栈有一种特点:它允许后进入的数据先拿出来。类似一个弹夹,或是一个装砖头的容器。栈的基本操作有如上图:类比一个缸,缸的底端是栈底,顶端是栈顶,放入数据称为入栈,取出数据称为出栈。对于一个......
  • 用Python开发输入法后台(5)——数据结构
    全部汉字我从网上收集了一些资料,构建了一个<全部汉字.json>文件,文件格式如下所示:{"吖":[["aa","ya"],"szhdps"],"呵":[["aa",......
  • 【rabbitMQ】-延迟队列-模拟控制智能家居的操作指令
    这个需求为控制智能家居工作,把控制智能家居的操作指令发到队列中,比如:扫地机、洗衣机到指定时间工作 一.什么是延迟队列?延迟队列存储的对象是对应的延迟消息,所谓“延迟消息”是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费......
  • 数据结构与算法—排序算法篇
    1、选择排序1.1、算法思想每趟从待排序的数据元素中,选出最小(或最大)的一个元素,顺序放在待排序的数列最前面,直到全部待排序的数据元素排完。1.2、步骤1、查找此数列中的最小元素,将其与第一个交换2、从第二个值开始找,查找到最小元素,将其与第二个交换3、以此类推,直到遍历结束1.3、算法......
  • 基础数据结构方法汇总
    字符串方法:mystr.capitalize()第一个字符转换为大写,其它都转为小写(本来的大写字母也转为小写)"abCd"-->Abcd 列表方法:lst.count(obj)lst.append(obj)lst.extend(obj)lst.index(obj)元素obj不存在,则会引发ValueError异常lst.insert(下标,obj)如果下标不存在,则会插......
  • kissat分析01_基本数据结构03_frame_trail
      frame.h1#defineINVALID_TRAILUINT_MAX23structframe4{5unsigneddecision;6unsignedtrail:LD_MAX_TRAIL;7unsignedused:2;8boolpromote:1;9};1011//*INDENT-OFF*1213typedefSTACK(frame)frames;1415//*I......
  • 【前端算法学习】数据结构之“栈”
    JS中最棒的数据结构:数组​ 数组是计算机科学中最常用的数据结构。我们知道,可以在数组的任意位置上删除或添加元素。然而,有时候我们还需要一种在添加或删除元素时有更多控制的数据结构。有两种数据结构类似于数组,但在添加和删除元素时更为可控。它们就是栈和队列。​ 要开始学......