(浙大陈越版)数据结构 第二章 线性结构 2.3 队列

news2024/11/17 21:31:48

目录

2.3.1 队列及顺序存储实现

什么是队列

概念:

特性:

队列的抽象数据类型描述

队列的顺序存储实现

解决方案:

2.3.2 队列的链式存储实现


2.3.1 队列及顺序存储实现

什么是队列

概念:

和堆栈一样,是一种受限的线性表。

特性:

  • 插入和删除操作:只能在一端插入,在另一端删除
  • 数据插入:称为入队(AddQ)
  • 数据删除:称为出队(DeleteQ)
  • 特性:先进先出,First In First Out——FIFO

队列的抽象数据类型描述

类型名称:队列

数据对象集:一个有0~N个元素的有穷线性表

操作集:长度为MaxSize的队列Q∈Queue,队列元素item∈ElementType

  1. Queue CreateQueue(int MaxSize)          生成长度为MaxSize的空队列
  2. int IsFullQ(Queue Q,int MaxSize)            判断队列Q是否已满
  3. void AddQ(Queue Q,ElementType item) 将数据元素item插入队列Q中
  4. int IsEmpty(Queue Q)                              判断队列Q是否为空
  5. ElementType DeleteQ(Queue Q)             将队列头数据元素从队列中删除并返回

队列的顺序存储实现

通常使用一个一维数组、一个记录队列头元素位置的变量front、一个记录队列尾元素的变量rear来实现队列。

规律:front和rare初始都为-1.插入一个元素,rear加一,删除一个元素时,front加一,删除时相当于把队列向后移动.

假设一个极端情况:队列容量为6,每插入一个元素之后紧接着就删除它,当处理了6个元素之后,队头队尾都到了最后一位,现在想要插入元素就变得不可能了。于是我们提出一个概念叫循环队列:

缺点:开始时,front==rear,为空。放满元素后二者也相等,于是队列的空和满无法判断。判断空和满是通过两个变量位置的距离。二者的距离只有0、1、2、3、4、5这6种。而队列装载元素的状态有0、1、2、3、4、5、6这7种。用n种的状态来区分n+1种的状态,显然从数学上来说是有缺陷的。

解决方案:

1.使用额外标记:Size或Tag域

  • 加入一个元素时Size+1,删除时-1,根据Size为0或N来判断队列的空和满
  • 加入元素Tag为1,删除元素Tag为0,当front==rear时查看Tag值,即最后一次操作是插入还是删除,如果是插入元素说明是队满,删除说明是队空。

2.虽然申请n个位置的空间,但仅使用n-1个(本案例使用方案)

//1.入队
void AddQ(Queue PtrQ,ElementType item)
{
//具体实现循环队列中“循环”的要素,若要让第0号位成为第6号位,
//就用5的下1位对6求余
    if( (PtrQ->rear+1)%MaxSize == PtrQ->front ){
        printf("队列满");
        return;
    }
    PtrQ->rear = (PtrQ->rear+1)%MaxSize;
    PtrQ->Data[PtrQ->rear] = item;
}

//2.出队
ElementType DeleteQ(Queue PtrQ){
    if( PtrQ->front == PtrQ->rear ){
        printf("队列空");
        return ERROR;
    }else{
        PtrQ->front = (PtrQ->front+1)%MaxSize;
        return PtrQ->Data[PtrQ->front];
    }
}

2.3.2 队列的链式存储实现

链式存储也可以用一个单(向)链表实现。插入和删除分别在链表两头进行。front指向链表头;rear指向链表尾

struct Node{
    ElementType Data;
    struct Node *Next;
};

struct QNode{
    struct Node *rear;
    struct Node *front;
};

typedef struct QNode *Queue;
Queue PtrQ;
1.队列出队(没有头结点的链表)
ElementType DeleteQ(Queue PtrQ){
    struct Node *FrontCell;
    ElementType FrontElem;

    if( PtrQ->front == NULL ){
        printf("队列空");
        return ERROR;
    }

    FrontCell = PtrQ->fornt;//找到头结点

    //如果只有一个元素
    if( PtrQ->front == PtrQ->rear ){
        //删除元素后队列置空,两个都要指向NULL
        PtrQ->front == PtrQ->rear = NULL;
    }else{
        //不止一个元素,front往后移
        PtrQ->front == PtrQ->front->Next;
    }

    FrontElem = PtrQ->Data;
    free(FrontCell);//释放空间
    return FrontElem;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/496863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马点评项目导入

文章目录 开篇导读项目地址导入SQL项目架构介绍后端项目导入前端项目导入 开篇导读 亲爱的小伙伴们大家好,马上咱们就开始实战篇的内容了,相信通过本章的学习,小伙伴们就能理解各种redis的使用啦,接下来咱们来一起看看实战篇我们…

刚刚!BingChat全面开放,人人可用!

大家好,我是鸟哥。 如题,微软真是下血本。昨天毫无征兆的宣布BingChat全面开放,人人可用!众所周知ChatGPT得使用门槛有多高,而BingChat底层调用的是GPT4.0的模型,这无疑是白嫖GPT4.0最简单的姿势了。鸟哥一…

阿里云服务器镜像怎么选?操作系统版本选择说明

阿里云服务器镜像怎么选择?云服务器操作系统镜像分为Linux和Windows两大类,Linux可以选择Alibaba Cloud Linux,Windows可以选择Windows Server 2022数据中心版64位中文版,阿里云百科来详细说下阿里云服务器操作系统有哪些&#xf…

【移动端网页布局】flex 弹性布局 ④ ( 设置子元素是否换行 | flex-wrap 样式说明 | 代码示例 )

文章目录 一、设置子元素是否换行 : flex-wrap 样式说明1、flex-wrap 样式引入2、flex-wrap 样式取值说明 二、代码示例1、代码示例 : 默认情况下 flex 弹性布局子元素不会自动换行2、代码示例 : 自动换行 一、设置子元素是否换行 : flex-wrap 样式说明 1、flex-wrap 样式引入 …

统计字符串字符出现的次数

输入一个字符串,输出字符及相应字符出现的次数。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单…… 地址:https://lqp…

navicat连接云服务器mysql教程

包含navicat报错解决! 文章目录 1 点击连接后填写相关内容2 报错解决2.1 1130 - Host XXX is not allowed to connect to this MySQL server。2.2 服务器未开启mysql端口通道 1 点击连接后填写相关内容 主机名或ip地址:填写服务器公网ip 用户名和密码&a…

GitHub使用(1):杂项

目录 1. ubuntu推送到github鉴权失败2. 分支重命名3. 指令升级删除分支推送到远程仓库 1. ubuntu推送到github鉴权失败 翻译下就是 remote:2021 年 8 月 13 日删除了对密码身份验证的支持。 远程:有关当前推荐的身份验证模式的信息,请参阅 ht…

开会记录【NiFi数据集成、AllData数据中台管理系统、RuoYi】

今天上午和下午开了个小会,上午说了一下Nifi,下午具体说了一下nifi和ruoyi。 目录 上午 下午 上午 三个人开会。 上次说的挖掘平台,您这边是否有技术人员对nifi比较熟悉,并且能够将相关功能集成到数据中台系统中。 现在结构化的…

LeetCode---回溯算法中的子集问题

78. 子集 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2]…

浅谈“孔乙己”的长衫

书中的孔乙己 孔乙已是鲁迅笔下人物,穷困流倒还穿着象征读书人的长衫,迁腐、麻木。最近,大家自我调佩是“当代孔乙己”,学历成为思想负担,找工作时高不成低不就。 当代的“孔乙己” 如今社会,从小学开始每…

【DP】学习之背包问题

01背包 2. 01背包问题 - AcWing题库 记忆化搜索 #include<bits/stdc.h> using namespace std; const int N1e310; int n,m; int v[N],w[N]; int res; int mem[N][N]; int dfs(int x,int spv) {if(mem[x][spv]) return mem[x][spv];if(x>n) return mem[x][spv]0;if…

国内免费使用gpt-4-如何接入ChatGPT4

如何用上gpt-4 GPT-4尚未正式发布和公开&#xff0c;因此我们无法提供对GPT-4的具体使用方法。但是&#xff0c;可以从GPT-4的前一代——GPT-3的使用经验和GPT-4的预期功能来看&#xff0c;建议如下&#xff1a; 了解GPT-4的语言处理能力和适用场景&#xff1a;GPT-4预计将进一…

项目实现读写分离操作(mysql)

读写分离 1.问题说明 2.读写分离 Master&#xff08;主库&#xff09;----(数据同步)—> Slave&#xff08;从库&#xff09; Mysql主从复制 mysql主从复制 介绍 mysql主从复制是一个异步的复制过程&#xff0c;底层是基于mysql数据库自带的二进制日志功能。就是一台或多台…

【C语言】数组讲解

【C语言】数组讲解 1.一维数组的创建和初始化1.1一维数组的创建1.2一维数组的初始化1.3一维数组的使用1.4一维数组在内存中的存储 2.二维数组的创建和初始化2.1二维数组的创建2.2二维数组的初始化2.3二维数组的使用2.4一维数组在内存中的存储 3.数组越界4.数组作为函数参数4.1冒…

Mysql第四章 分库分表,读写分离,主从架构

这里写自定义目录标题 一 分库分表1 为什么要分库分表2 分库分表的几种方式2.1 垂直拆分2.1.1 表的垂直拆分2.1.2库的垂直拆分2.1.2 垂直拆分的特点 2.2 水平拆分2.2.1 表的水平拆分2.2.2 库的水平拆分2.2.3 水平拆分的特点 3 分库分表的技术选型3.1 JDBC直连层3.2 proxy代理层…

RocketMQ安装以及源码启动

RocketMQ是一款消息中间件&#xff0c;在我们项目中主要是使用它来进行异步处理业务以及进行解耦&#xff0c;当然还可以用它实现其他业务需求比如流削峰等等&#xff0c;它提供的功能特别多&#xff0c;比如延迟消费、定时消费、消息重试、顺序消费等等。它的整体设计是追求简…

基于Session实现短信验证码登录流程

文章目录 1 发送短信验证码与登录2 登录拦截功能3 隐藏用户敏感信息4 问题: 多台Tomcat的session共享问题 分析一下流程 发送验证码&#xff1a; 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号…

Django后端-短信验证码登录

前端我使用的是vben-admin&#xff08;悄悄说一下&#xff0c;好难用。。&#xff09;&#xff0c;对原生的登录页进行了修改。 本文主要讲一下后端实现。 参考文档&#xff1a; djangocelery使用阿里云短信服务异步发送注册验证码_小泽十一章的博客-CSDN博客 django-实现登录…

单链表OJ题:LeetCode--203.移除链表元素

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;今天给大家带来的是LeetCode中203题&#xff1a;移除链表元素 数据结构&#xff1a;数据结构专栏 作 者&#xff1a;stackY、 C 语 言 &#xff1a;C语言专栏 LeetCode--203.移除链表元素&#xff1a;https://leetco…

攻防世界-web-simple js

题目描述&#xff1a;小宁发现了一个网页&#xff0c;但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} ) 打开链接&#xff1a; 然后我们会发现不管我们输入什么密码&#xff0c;发现是都是这样的报错 1. 先用bp抓包看看&#xff0c;可以抓到这样的一串js脚本 看不懂…