数据结构与算法(九)-- 队列

2023-11-08

                                                               队列

队列的定义:它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。

顺序队:采用顺序存储结构的队列,存储空间连续。           front指向对头元素

  rear 指向队尾元素的下一个位置

队列的定义

#define MaxSize 50
typedef strcut{
    ElemType data[MaxSize];    
    int front, int rear;    //队头指针、队尾指针
}SqQueue;

初始化:front = rear = 0  //队尾与对头指向一致

判空:Q.front == Q.rear;

求长度:Q.rear - Q.front

队满:(Q.rear+1)%QueueSize = front;   

循环队列:为了防止队列假溢出,将存储队列的顺序队列视为一个环,将rear指向循环位置

循环队列的操作:取余(%MaxSize)  将队尾后的元素整除最大个数,然后重新计数(继续从front开始)

循环队列是一个环,在末尾时要挪到下一个时候需要指定到初始位置,取余操作可以满足一个数一直加但最终结果一直在0和队列长度之间循环的要求

front指针移动:Q.front = (Q.front+1)%MaxSize;

rear指针移动: Q.rear = (Q.rear+1)%MaxSize;

队列长度: (Q.rear+MaxSize - Q.front)%MaxSize;

队满:(Q.rear+1)%MaxSize = front;

判空:Q.front = Q.rear;

为了防止队满与对空冲突,需要牺牲一个存储单元:Q.front == (Q.rear+1)%MaxSize;  //判断rear是否在front之前                           或者增加一个变量代表元素个数: Q.size == 0;  //对的大小为0         Q.size == MaxSize;  //队的大小为最大值,队满。                 

循环队列的基本操作:

void InitQueue(SqQueue &Q){    //初始化循环队列为空
    Q.rear == Q.front = 0;    //初始在对头位置
}

bool isEmpty(SqQueue Q){    //判空
    if(Q.rear == Q.front)
        return true;
    else return flase;
}

bool InsertQueue(SqQueue &Q, ElemType x){
    if((Q.rear+1)%MaxSize == Q.front){  //队满
        return false;
    }
    Q.data[Q.rear] = x;                 //x变量放在队尾
    Q.rear = (Q.rear+1)%MaxSize;        //移动指针,前移到队尾
}

bool Delete_Queue(SqQueue &Q, &x){    //出队操作(删除队头结点)
    if(Q.rear == Q.front)        //队空
        return false;
    x = Q.data[Q.rear];        //删除队头元素
    Q.front = (Q.front+1) % MaxSize;     //对头指针前移一位
    return true;
}    

队列的链式存储结构:链队

用带头结点队列,可以实现插入、删除、判空的统一(方便操作)

定义链队:

typedef struct{        //定义链式结构体
    ElemType data;
    struct LinkNode *next;
}LinkNode;

typedef struct{
    LinkNode *front, *rear;    //定义队头指针与队尾指针
}

空链队形式:

链队的基本操作:

typedef InitQueue(LinkQueue &Q){
    Q.front = (LinkNode *) malloc (sizeof(LinkNode));    //动态分配结点内存
    Q.rear = Q.front;    //空队    
    Q.front->next = null;    //队头后继指向为空
}

判空操作:if(Q.front == Q.rear)        return true;
入队操作:

bool Insert_Queue(LinkQueue &Q, ElemType x){
    LinkNode *s = (LinkNode *) malloc (sizeof(LinkNode));    //分配一个新节点
    s->next = null;    //在队尾进行插入
    s->data = data;
    Q.rear->next = s; //队尾指针为新结点
    Q.rear = s;    //s为新队尾
}

出队操作:在对头进行删除

bool Delete_Queue(LinkQueue &Q, ElemType &x){
    if(Q.rear == Q.front){
        return false;
    }
    LinkNode *p = Q.front->next;      //指定为队头结点
    x = p->data;
    Q.rear->next = p->next;    //被删结点的后继转移为队头结点
    if(Q.rear == p){
        Q.rear = Q.front;        //修改为头结点
    }
    free(p);
    return true;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法(九)-- 队列 的相关文章

  • 如何防止 Json.NET 将枚举转换为字符串?

    下面的课 public class RequestSections RequestBase public RequestSections Command c Dictionary
  • URL 的正则表达式

    我已经编写了正则表达式来验证 URL 它可以是这样的 example com www example com http www example com http www example com https www example com h
  • 在 C# 中实例化 python 类

    我已经用 python 编写了一个类 我想通过 IronPython 将其包装到 net 程序集中 并在 C 应用程序中实例化 我已将该类迁移到 IronPython 创建了一个库程序集并引用了它 现在 我如何真正获得该类的实例 该类看起来
  • C++ 中的字符串到 LPCWSTR

    我正在尝试从字符串转换为 LPCWSTR 我使用多位 1 例如 LPCWSTR ToLPCWSTR string text LPCWSTR sw LPCWSTR text c str return sw 2 返回中文字符 LPCWSTR T
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • C# 动态 Linq 变量Where 子句

    我正在按照 Scott Gu 的文章创建动态 LINQhttp weblogs asp net scottgu archive 2008 01 07 dynamic linq part 1 using the linq dynamic qu
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • EASTL 与 STL 相比,std::vector::operator[] 怎么会有这么大的性能差异

    根据http www open std org jtc1 sc22 wg21 docs papers 2007 n2271 html http www open std org jtc1 sc22 wg21 docs papers 2007
  • 如何在 asp .net mvc 2 中对不直接属于我的模型的对象使用 DisplayFor()?

    我确信我在这里遗漏了一些非常简单的东西 我创建了一个自定义日期时间显示模板 使用以下方法时效果很好 但是 我遇到了这样的情况 在部分控件内 我在 for 循环中迭代模型中的对象 我想要一个 DateTime 属性来使用显示模板 但我不知道如
  • 输入缓冲区刷新

    考虑下面的代码 include
  • 我需要一个树转储选项,该选项在当前的 gcc 版本中不再存在

    旧版本的 GCC 例如 4 0 2 或 4 1 2 有该选项 df see 用于调试程序或 GCC 的选项对于4 1 2 http gcc gnu org onlinedocs gcc 4 1 2 gcc Debugging Options
  • 使用 microsoft word.interop 删除 Word 文档中的空白页

    我创建了一个Word文档 它使用以下命令生成动态内容词互操作 它有一些分页符之间使用 我面临的问题是 此分页符会创建我不想向用户显示的空白页面 在某些情况下 我需要在那里添加这些分页符以维护页面布局 因此我无法考虑删除这些分页符 但我想要的
  • C# 列表框 ObservableCollection

    我正在尝试使用 ListBox DataSource ObservableCollection 但是我不知道如何在 OC 更新时让列表框自动更新 我可以在 OC 上挂接 CollectionChanged 事件 但是我需要对列表框执行什么操
  • 如何从c++调用python

    我是Python新手 我尝试像这样从 C 调用 python 脚本 在 Raspberry Pi 中 std string pythonCommand python Callee py a b int res system pythonCo
  • 如何定义 Swagger UI 参数的默认值?

    我已将 Swagger Swashbuckle 集成到 NET Core 2 2 API 项目中 一切都很好 我的要求纯粹是为了方便 考虑以下 API 方法 public Model SomeEstimate SomeRequest req
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • g++4.9 不支持 std::align

    在学习对齐问题等时 我意识到我的 g 4 9 macports OS X 实现不支持std align 如果我尝试编译 使用 std c 11 此示例代码来自http www cplusplus com reference memory a
  • 如何在OpenGL中像这样绘制连接的带状线

    我想用以下方式绘制一系列连接线 GL LINE STRIP 我尝试过自己编写代码 但没有得到想要的结果 所以我来到这里 帮助我找出我错在哪里 这里我只给出我的draw 函数 glBegin GL LINE STRIP glVertex2f
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路

随机推荐

  • MSF图形化界面Viper(炫彩蛇)下载与使用

    Viper 炫彩蛇 是一款图形化内网渗透工具 将内网渗透过程中常用的战术及技术进行模块化及武器化 Viper 炫彩蛇 集成杀软绕过 内网隧道 文件管理 命令行等基础功能 Viper 炫彩蛇 当前已集成70 个模块 覆盖初始访问 持久化 权限
  • zsh: command not found: brew

    问题 已经安装好Homebrew 命令行查看brew v 显示zsh command not found brew 解决方案 打开 如不存在此文件会自动创建 vim zshrc 在里面添加一行 export PATH opt homebre
  • 【数据结构】手把手带你搞懂顺序表(带图详解)

    文章目录 前言 1 顺序表 1 1 顺序表的结构体 1 2 功能实现 初始顺序表 增加顺序表长度 顺序表的查找 顺序表的插入 顺序表的删除 打印顺序表 顺序表的销毁 1 3 顺序存储结构的优缺点 顺序表总代码 前言 在本篇博客中 我会概述顺
  • 12.20 摄像机跟随玩家

    public class CameraFollow MonoBehaviour Transform player float up 11 away 17 Vector3 pos float speed 3f void Start playe
  • 基于JSP的网络超市商品销售管理系统的毕业设计与实现

    论文题目 基于JSP的网络超市商品销售管理系统的毕业设计与实现 摘要 随着电子商务的快速发展 网络超市已经成为人们购物的重要途径之一 本文基于JSP Java Server Pages 技术 设计了一个网络超市商品销售管理系统 旨在提供一个
  • BUUCTF,Web:[极客大挑战 2019]Havefun

    无其他可动项 先看源码 cat GET cat echo cat if cat dog echo Syc cat cat cat cat get 传 cat dog 得到 flag
  • datagrip插入汉字报错

    1 datagrip报错信息 HY000 1366 Incorrect string value xE5 xA4 xA7 xE5 xB8 x88 for column name at row 1 2 原因 编码格式有问题 建立表的时候不能插
  • 多线程之间实现通讯

    多线程之间如何实现通讯 什么是多线程之间通讯 多线程之间通讯 其实就是多个线程在操作同一个资源 但是操作的动作不同 画图如下 我这里有个例子 就是弄两个线程 一个进行写 一个进行读 写的话 如果是偶数 就是java 男 如果是奇数 就是ph
  • c++编写消消乐游戏

    include
  • AR基础讲解:打造AR元宇宙博物馆编程之旅

    AR基础讲解 打造AR元宇宙博物馆编程之旅 随着技术的不断发展 增强现实 AR 正逐渐成为各个领域的热门技术 而在AR中 构建一个全新的虚拟世界 AR元宇宙博物馆 使我们能够透过手机或其他AR设备与数字内容进行互动 本文将为大家介绍如何使用
  • 美国病毒systemd占用100%,root密码登录卡死

    1 top 查看到有僵尸进程一直启动 2 lsof p 752 查看进程的来源 3 crontab l 查看定时任务 是否有自动启动
  • C语言网络编程(二)建立套接字通讯UDP

    所谓socket套接字 指的是在网络通信以前建立的通信接口 进行网络连接以前 需要向系统注册申请一个新的socket 然后使用这个socket进行网络连接 提示 套接字 传输层协议 端口号 IP地址 在进行网络连接以前 需要用socket函
  • 代码随想录算法训练营19期第57天

    647 回文子串 代码随想录 初步思路 动态规划 总结 dp i j 表示区间范围 i j 注意是左闭右闭 的子串是否是回文子串 当 s i s j 时 需要判断 dp i 1 j 1 是不是一个回文串 if s i s j j i lt
  • 3分钟搞懂js的冒泡和捕获?

    为了快速理解js冒泡和捕获 我们先看代码
  • 桌前检查、代码评审、走查

    桌前检查 Disk Checking 这是一种传统的检查方法 由程序员检查自己编写的程序 程序员在程序通过编译之后 进行单元测试之前 对源程序代码进行分析 检验 并补充相关的文档 目的是发现程序中的错误 检查项目有 1 检查变量的交叉引用表
  • 浅谈3NF(范式)建模

    范式 一张数据表的表结构所符合的某种设计标准的级别 构造数据库必须遵循一定的规则 在关系型数据库中 这种规则就是范式 范式是符合某一种级别的关系模式的集合 目前关系数据库有六种范式 第一范式 1NF 第二范式 2NF 第三范式 3NF 第四
  • Pycharm及python安装详细教程(图解)

    更多编程教程请到 菜鸟教程 https www piaodoo com 友情链接 好看站 http www nrso net 首先我们来安装python 1 首先进入网站下载 点击打开链接 或自己输入网址https www python o
  • java类是公共的应当声明,java 类是公共的,应在名为.java 的文件中声明

    java 类是公共的 应在名为 java 的文件中声明 关注 162 答案 2 mip版 解决时间 2021 01 16 12 24 提问者关系已逝 2021 01 15 16 19 import javax swing JOptionPa
  • ajax中中loaddate,jQuery中ajax的load()与post()方法实例详解

    本文实例讲述了jQuery中ajax的load 与post 方法 分享给大家供大家参考 具体如下 一 load 方法 在jQuery ajax的load 方法能够载入远程 HTML 文件代码并插入至 DOM 中 这个与post get还是有
  • 数据结构与算法(九)-- 队列

    队列 队列的定义 它只允许在表的前端 front 进行删除操作 而在表的后端 rear 进行插入操作 进行插入操作的端称为队尾 进行删除操作的端称为队头 顺序队 采用顺序存储结构的队列 存储空间连续 front指向对头元素 rear 指向队