【线性表】队列:顺序队列、顺序循环队列、链式队列的基本特性

顺序队列/链式队列         队列是另一种限定性的线性表,他只允许在表的一端插入元素,而在表的另一端删除元素,具有“先进先出”的特点。在队列中,允许插入的一端称为队尾,允许删除的一端称为队首。        与线性表相似,队列也有两种存储结构:顺序队列和链式队列。一,顺序队列        顺序队列使用顺序表来实现的,即队列中的元素均存放在一片连续的内存空间中。通过该片内存的地址对队列中元素进行访问。之前是用数... 阅读详情

队列是一种特殊的线性表,特殊之处在于它只允许头部和尾部进行操作。


Table of Contents

顺序队列

顺序循环队列

链式队列


顺序队列

队列定义:

  1. 队列(queue)是只允许在一端(一般为尾部)进行插入操作,另一端(一般是头部)进行删除操作的线性表。
  2. 队列是一种先进先出的线性表,允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。
  3. 队列是一种运算受限制的线性表,所以又叫先进先出表(First In First Out),简称FIFO表。
  4. 例如,排队打饭、买票就是一种队列。

队列的特性:

  1. 向队列中插入元素称为入队,从队列中删除元素称为出队。
  2. 当队列中没有元素时称为空队列。
  3. 队列的操作是按先进先出的原则进行的,即新添加的元素总是加到队尾(rear),每次离开的元素总是队头(front)的元素。

什么是顺序队列:

  1. 顺序队列 = 数组 + 队列的思想
  2. 假设一个队列有n个元素,则顺序存储的队列需要建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即为队头(front),数组下标为n-1的一端为队尾(rear)。
  3. 在数组的基础上,使用front和rear限定增删操作,就为顺序队列
  4. 所谓的入队,就是在队尾追加一个元素,不需要移动任何元素。队尾下标加一,将元素存入该下标所在的数组中。时间复杂度为O(1)。
  5. 所谓的出队,就是在队头(front)减一即可。

顺序队列的代码定义

#define SIZE 20

typedef struct sequence_queue
{/*algorithm:本质上是一个数组,用两个数来保存数组现在位置的下标;*/
	int data[SIZE];
	int front;
	int rear;
}node;

顺序队列特性:

  1. 当 front 等于 rear 时,不是队列中有一个元素,而是表示空队列。
  2. front一定是在rear的前面,或者是相等。
  3. rear会有数组溢出的风险。

 

顺序队列的操作:

  • 队列的数据区为:[sq.data[0], sq.data[MAXSIZE -1]]
  • 队头指针:sq.front
  • 队尾指针:sq.rear
  • 置空队则(初始化):sq.front=sq.rear=-1;
  • 队中元素的个数:m=(sq.rear)-(q.front);
  • 队满时:m= MAXSIZE; 队空时:m=0。
  • 在不考虑溢出的情况下,入队操作队尾指针加1,指向新位置后,元素入队。操作如下:sq.rear++; sq.data[sq.rear]=x;

 

  • 在不考虑队空的情况下,出队操作队头指针加1,表明队头元素出队。操作如下:sq.front++; x=sq.data[sq.front];

 

第一个顺序队列

第一个顺序队列
#include <stdio.h>
#define MAX 10

typedef struct node
{
	int data[MAX]; //数组
	int front; //队头
	int rear; //对尾
}queue;

int main()
{
	queue MyQueue;

	//初始化
	MyQueue.front = -1;
	MyQueue.rear = -1;

	//入队
	MyQueue.rear++;
	MyQueue.front++;
	MyQueue.data[MyQueue.rear] = 100;
	MyQueue.data[++MyQueue.rear] = 200;
	MyQueue.data[++MyQueue.rear] = 300;

	//出队
	MyQueue.front++;

	//遍历
	for (int i = MyQueue.front; i <= MyQueue.rear; i++)
	{
		printf("%d ", MyQueue.data[i]);
	}

	return 0;
}
 


顺序循环队列

定义:在顺序队列的基础上行,把队列的这种头尾相接的顺序存储结构称为循环队列。即把rear指向0位置。

基础操作(设队列的最大尺寸为QueueSize):

  1. 初始化:q.front = q.rera = 0;
  2. 队列满的判断条件改为(rear+1)%QueueSize == front
  3. 队列的长度为(rear - front + QueueSize)% QueueSize
  4. 入队时的队尾指针加 1 操作修改为  q.rear  = (q.rear + 1) % QueueSize
  5. 出队时的队首指针加 1 操作修改为  q.front = (q.front + 1) % QueueSize

 如何区分队空还是队满

由于形成了一个环,rear == front无法判定是队空还是队满。

解决方案:

 

第一个顺序循环队列 

第一个顺序循环队列
#include <stdio.h>
#define QueueSize  10

typedef struct node
{
	int data[QueueSize]; //数组
	int front; //队头
	int rear; //对尾
}LoopQueue;

int main()
{
	LoopQueue MyQueue;

	//初始化
	MyQueue.front = 0;
	MyQueue.rear = 0;

	//入队
	MyQueue.data[MyQueue.rear] = 100;
	MyQueue.rear = (MyQueue.rear + 1) % QueueSize; //不可以直接++,因为循环队列 最后一个元素的下一个下标可能是0号元素
	MyQueue.data[MyQueue.rear] = 200;
	MyQueue.rear = (MyQueue.rear + 1) % QueueSize;
	MyQueue.data[MyQueue.rear] = 300;
	MyQueue.rear = (MyQueue.rear + 1) % QueueSize;

	//出队
	MyQueue.front = (MyQueue.front + 1) % QueueSize;

	int len = (MyQueue.rear - MyQueue.front + QueueSize) % QueueSize;
	printf("此时循环队列长度:%d\n", len);

	//遍历
	for (int i = MyQueue.front; i != MyQueue.rear; i = (i + 1) % QueueSize)
	{
		printf("%d ", MyQueue.data[i]);
	}

	return 0;
}

 


链式队列

链式队列:

  1. 链式队列 = 单链表 + 队列的思想
  2. 只不过它只能是尾进头出而已。将队头指针指向链队列的头结点,而队尾指针指向终端结点。
  3. 通常将链式队列设计成一个带头结点的单链表,因为这样使得插入和删除统一。
  4. 链式队列适合数据元素变动比较大的情形。

链式队列的代码定义

//本质:一个单链表加上一个队列首尾指针;

typedef struct link_queue
{//定义存储数据的单链表;
	int data;
	struct link_queue* next;
}node;

typedef struct
{//定义队首队尾指针;
	node* front, * rear;//申明两个node型结构体指针,front用来保存头,rear用来保存尾巴;
}queue;

入队操作

链式队列的入队操作其实就是在链表尾部插入结点:

出队操作

出队操作时,就是头结点的后继结点出队,若链表除头结点外只剩一个元素时,则需将rear指向头结点:

第一个链式队列

#include <stdio.h>
#include <malloc.h>
#include <assert.h>

typedef struct link_queue
{ //定义存储数据的单链表;
	int data;
	struct link_queue* next;
}node;

typedef struct
{ //定义队首队尾指针;
	node* front, * rear;//申明两个node型结构体指针,front用来保存头,rear用来保存尾巴;
}queue;

void push(queue* MyQueue, int value)
{
	assert(MyQueue != NULL);
	node* NewNode = (node*)malloc(sizeof(node));
	assert(NewNode != NULL);
	NewNode->data = value;

	if (MyQueue->front == NULL  && MyQueue->rear == NULL) //空队列
	{
		MyQueue->front = NewNode;
	}
	else
	{
		MyQueue->rear->next = NewNode;
	}
	MyQueue->rear = NewNode;
}

int pop(queue* MyQueue)
{
	assert(MyQueue != NULL);
	node* tmp = MyQueue->front;
	int value = tmp->data;
	MyQueue->front = tmp->next;

	if (MyQueue->front == NULL)  // 最后一个节点出队的时候
	{
		MyQueue->rear = NULL;
	}
	free(tmp);
	tmp = NULL;
	return value;
}

int main()
{
	queue* MyQueue = (queue*)malloc(sizeof(queue));
	assert(MyQueue != NULL);

	MyQueue->front = NULL;
	MyQueue->rear = NULL;

	push(MyQueue, 100);
	push(MyQueue, 200);
	push(MyQueue, 300);
	push(MyQueue, 400);

	pop(MyQueue);
	pop(MyQueue);
	
	node* p = MyQueue->front;
	assert(p != NULL);
	while (p != MyQueue->rear->next)
	{
		printf("%d  ", p->data);
		p = p->next;
	}

	return 0;
}


 

LangChain + PlayWright实战:5分钟搞定网页自动化测试(附完整代码) 本文详细介绍了如何利用LangChain与PlayWright构建智能网页自动化测试系统。通过环境配置、核心架构设计、实战Agent构建及性能优化等步骤,开发者可以快速实现高效的Web操作自动化,提升测试效率。文章还提供了完整代码示例和典型问题解决方案。 阅读详情

相关推荐

保姆级教学:从0搭建微信小程序SpringBoot+Vue(一)

目标:实现一个微信小程序从后端数据库MySQL获取的商品展示页。 框架:后端采用SpringBoot,前端采用Vue,数据库MySQL。 部署工具:IntelliJ IDEA 2024.2专业版+HbuilderX+Node+微信开发者工具,jdk1.8已安装

weixin_44545610的博客 4925

数据结构:队列(顺序队列)&链式队列

队列 一、什么是队列? 1.是一种特殊的线性表 2.只允许在一端进行插入数据,在另一端进行删除数据 二、队头&amp;amp;amp;amp;amp;amp;amp;队尾&amp;amp;amp;amp;amp;amp;amp;入队列&amp;amp;amp;amp;amp;amp;amp;出队列 1.队头:进行删除数据的一端 2.队尾:进行插入数据的一端 3.入队列:在队尾处进行插入数据的操作 4.出队列:在队尾处进行删除数据的

dangzhangjing97的博客 5427

Qt界面编程(三)—— 父子关系、对象树、信号和槽(自定义信号和槽、Qt5与Qt4的写法)

Qt框架默认提供的标准信号和槽不足以完成我们日常应用开发的需求,比如说点击某个按钮让另一个按钮的文字改变,这时候标准信号和槽就没有提供这样的函数。但是Qt信号和槽机制提供了允许我们自己设计自己的信号和槽。声明在类的signals域下没有返回值,void类型的函数只有函数声明,没有定义可以有参数,可以重载通过emit关键字来触发信号,形式:emit object->sig(参数);

此心光明事上练的博客 1695

【数据结构与算法 3】单链表

一、链表的特点 1、链表是一种非线性、非顺序的物理结构,是由多个节点组成。 2、链表采用的是“见缝插针”的存储方法,不要求内存连续,靠next指针关联起来。 3、链表的物理存储方式为随机存储,访问方式为顺序访问。 4、查找节点的时间复杂度为O(n),插入、删除节点的时间复杂度为O(1)。 5、链表适用于写操作多,读操作少的场景。 二、单链表 链表是有序的列表,但是它在内存中存储如下: 上图小结: 1、链表是以节点的方式来存储,是链式存储 2、每个节点包含data域,next域:指向下

学Java,找哪吒 9249

开源大模型“去审查化”技术解析:从LLaMA架构到本地部署与伦理边界

大型语言模型(LLM)基于Transformer架构,通过海量数据训练获得理解和生成自然语言的能力。其核心原理在于自注意力机制对上下文关系的建模。为了确保输出内容的安全与合规,主流模型普遍采用基于人类反馈的强化学习(RLHF)等技术进行安全对齐。这一过程旨在使模型行为符合人类价值观,是AI伦理工程实践的关键环节。然而,在特定研究场景下,如对抗性测试或内容安全算法研究,技术人员需要模拟极端对话以评估系统鲁棒性,这催生了针对“去对齐”或“移除护栏”的技术探索。此类技术通常通过对预训练模型进行反向微调或继续训练来

weixin_33743880的博客 588

COD论文笔记VSCode: General Visual Salient and Camouflaged Object Detection with 2D Prompt Learning

VSCode模型通过引入领域特定提示和任务特定提示,结合提示区分损失,成功地在单一模型中处理多个显著目标检测和伪装目标检测任务。这种方法不仅提高了模型的性能,还展示了其对未见任务的泛化能力。作者使用 Visual saliency transformer ICCV 2021 作为baseline model这张图展示了VSCode模型的整体框架,特别强调了2D提示学习方法。

985小菜鸡 1627

链表之队列

队列也属于链表的一种,他的特点是先入先出 也就是说在对位插入节点,在对头移除节点 template<typename T> struct Node{ public: Node(T value, Node<T> *next): value(value), next(next){} Node(T value): value(value){} N...

@way 198

某二级支行网络的设计与实现——配置脚本(1)

【代码】某二级支行网络的设计与实现——配置脚本(1)

u010311846的博客 577

【数据结构-C语言】顺序队列,链式队列

队列是最常见的概念,日常生活经常需要排队,仔细管擦和队列会发现,队列是一种逻辑结构,是一种特殊的线性表。特殊在只能在固定的两端操作线性表。 只要满足上述条件,那么这种特殊的线性表就会呈现一种“先进先出”的逻辑,这种逻辑就被称为队列。 由于约定了只能在线性表固定的两端进行操作,于是给队列这种特殊的线性表的插入删除,起个特殊的名称: 队头:可以删除节点的一端 队尾:可以插入节点的一端 入队:将节点插入到队尾之后,函数名通常为enQueue() 出队:将队头节点从队列中剔除,函数名通常为outQueue()

sakura0908的博客 973

用友U8接口开发全攻略:从EAI到OpenAPI的5种方式详解(附避坑指南)

本文深度解析了用友U8系统接口开发的五种核心方式:EAI、API、OpenAPI、SQL直连与内部CO组件。文章详细对比了各方式的适用场景、优缺点及实战操作,并提供了清晰的选型决策框架与避坑指南,帮助开发者根据具体业务需求选择最高效、最稳定的集成路径。

weixin_29322855的博客 683

AI自动化时代:一人公司的崛起与商业机会

AI技术正在重塑商业格局,催生"一人公司"创业新模式。这种轻资产、高效率的商业模式通过AI自动化运营,让个人创业者能以极低成本挑战传统企业。核心机会包括:1)AI自主公司替代人力密集型业务;2)为企业提供AI转型解决方案;3)利用AI工具实现个人创业。创业者需快速验证创意,聚焦人机协作,把握当前AI发展窗口期。未来,AI赋能的"一人公司"将成为商业新常态,带来更高的专业化和灵活性。抓住AI红利,学会人机协作,是个人创业成功的关键。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 518

队列--先进先出的线性表

前面的文章介绍了线性表,后进先出的线性表–栈。本文介绍另一种特殊的链表–队列以及队列的增删查。 1.队列的定义 与栈相似,队列也是一种特殊的线性表,与线性表的不同之处也是体现在对数据的增和删的操作上。 队列的特点是先进先出: 先进,表示队列的数据新增操作只能在末端进行,不允许在队列的中间某个结点后新增数据; 先出,队列的数据删除操作只能在始端进行,不允许在队列的中间某个结点后删除数据。也就是说队列的增和删的操作只能分别在这个队列的队尾和队头进行。 与线性表、栈一样,队列也存在这两种存储方式,即顺序队列和

Yangchenju的博客 7460

华为OD新系统机试真题 - 获取大写字母瓷砖拼出独特图案数量

华为OD机试新系统真题【获取大写字母瓷砖拼出独特图案数量】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统四月二十九号机试真题【获取大写字母瓷砖拼出独特图案数量】

qq_45776114的博客 1218

数据结构(特殊线性表之队列)

队列是只允许再两端进行插入和删除操作的线性表,在队尾插入,在队头删除,插入的一段被称为“队尾”,删除的一端被称为“队头”。队列包括顺序队列(循环队列)和链式队列。结构:先进先出FIFO循环队列为什么顺序队列就是循环队列?因为数组的缺陷很明显,如果你把第一个元素出队,后面元素一个一个前移动补全位置十分复杂浪费时间,所以我们就不移动让他空着;

Zz3528966192的博客 603

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构之——队列

队列抽象数据类型 队列(queue)是一种特殊的线性表,其插入和删除操作分别在线性表的两端进行。向队列中插入元素的过程称为入队,删除元素的过程称为出队。允许入队的一端叫做队尾,允许出队的一端叫做队头。没有元素的队列称为空队列。 由于插入和删除分别在队尾和队头进行,最先入队的总是最先出队。因此队列的特点是“先进先出”。队列的基本操作有创建队列、判断队列是否为空、入队和出队。队列和栈一样,不支持对指定位置的插入和删除。 声明队列接口Queue< T >如下 package Queue; publi

weixin_44741522的博客 553

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

7_队列【C语言】

顺序存储的队列之所以被称为循环队列,是因为可以利用更新队头队尾的下标信息,来循环地利用整个数组,出队入队时也不必移动当中的数据。从上图可以看到,链式队列主要控制队头和队尾,由于管理结构体中保存了当前队列元素个数size,因此可以不必设计链表的头节点,初始化空队列时只需要让队头队尾指针同时指向空即可。队列是最常见的概念,日常生活经常需要排队,仔细观察队列会发现,队列是一种逻辑结构,是一种特殊的线性表。从上述动图中可以观察到,需要牺牲至少数组中的一个存储位置,来区分循环队列中的满队和空队。

weixin_70953765的博客 1031

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数据结构与算法-栈和队列

顺序存储的队列之所以被称为循环队列,是因为可以利用更新队头队尾的下标信息,来循环地利用整个数组,出队入队时也不必移动当中的数据。从上图可以看到,链式队列主要控制队头和队尾,由于管理结构体中保存了当前队列元素个数size,因此可以不必设计链表的头节点,初始化空队列时只需要让队头队尾指针同时指向空即可。不管是顺序栈,链式栈,栈的操作逻辑都是一样的,但由于存储形式不同,代码的实现是不同的。队列是最常见的概念,日常生活经常需要排队,仔细观察队列会发现,队列是一种逻辑结构,是一种特殊的线性表。

m0_74147998的博客 408

数据结构之循环队列详解

队列介绍 队列是一种运算受限的线性表。所谓的运算受限主要是指插入操作限定在表的某一端(队尾)进行,删除操作限定在表的另一端(对头)进行。队列通常也被称为先进先出(FIFO)的线性表。 队列通常有两种存储结构,即顺序存储结构和链式存储结构。顺序存储结构的队列通常称为顺序队列。 注意:queue_max_size表示队列所能容纳的元素个数。front表示对头索引,rear表示队尾索引。 假溢出 接...

jixingye_1987的专栏 627

队列基本操作

/*****************************************/ //LQueue.h #pragma once typedef int QElemType; //typedef struct BTNode* QElemType; typedef struct QNode { QElemType data; struct QNode *_pNext; }...

zhang21722668的博客 10万+

C++数据结构-6-队列

基于C++的数据结构-6-队列

qq_50533529的博客 2934

数据结构——队列

队列

qixi_ao的博客 1153

408数据结构—栈和队列

栈和队列,包括数组,其实是数组线性表的范畴,所以它们还是属于。

Benaldo_Y的博客 2772

数据结构A2

数据结构进行中

weixin_75038092的博客 1305

栈和队列精华解析

一:栈和队列简介 栈和队列是使用频率最高的数据结构。栈和队列是指插入和删除只能在表的一端进行的线性表。 从数据结构的角度来看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此可称为限定性的数据结构。 栈 先进后出(限定性操作) 栈具有后进先出的特性,如果问题解决具有先进后出的天然特性的话,则求解的算法就要使用栈。比如:进制转换,括号匹配,表达式求值,函数调用,递归调用,八皇后问题,迷宫求解等。 队列(限定性操作) 先进先出 队列具有先进先出的特性,如果问题解

weixin_46297209的博客 1891

数据结构:队列

队列是最常见的概念,日常生活经常需要排队,仔细观察队列会发现,队列是一种逻辑结构,是一种特殊的线性表。特殊在:只能在固定的两端操作线性表只要满足上述条件,那么这种特殊的线性表就会呈现一种“先进先出”的逻辑,这种逻辑就被称为队列。由于约定了只能在线性表固定的两端进行操作,于是给队列这种特殊的线性表的插入删除,起个特殊的名称:队头:可以删除节点的一端队尾:可以插入节点的一端入队:将节点插入到队尾之后出队:将队头节点从队列中剔除。

一起学习 902

6、增删改 - 队列 - 先进先出的线性表

队列是什么 与栈相似,队列也是一种特殊的线性表,与线性表的不同之处也是体现在对数据的增和删的操作上。 队列的特点是先进先出: 先进,表示队列的数据新增操作只能在末端进行,不允许在队列的中间某个结点后新增数据; 先出,队列的数据删除操作只能在始端进行,不允许在队列的中间某个结点后删除数据。也就是说队列的增和删的操作只能分别在这个队列的队尾和队头进行,如下图所示: 与线性表、栈一样,队列也存在这两种存储方式,即顺序队列和链式队列: 顺序队列,依赖数组来实现,其中的数据在内存中也

qq_55961812的博客 277
上一篇: 【线性表】链表:循环单链表、双链表、循环双链表的基本特性
下一篇: 【线性表】栈:线性栈、动态线性栈、链式栈的基本特性
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值