队列

  • 队列的概念
    • 什么是队列
    • 队列的特征
  • 队列——顺序存储
    • 队列顺序存储基本算法分析
    • 队列顺序存储基本算法实现
    • 顺序队应用

队列的概念

队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。

特点 ;先进先出(FIFO)

什么是队列


我们先举一个售票处的例子:有两个栏杆挡着进入窗口进行买票,一个接一个的从栏杆后进去,在栏杆内等待,这起到公平工公正的作用,防止了插队。但是有一个坏处是,如果你尿急但还在栏杆中, 你是不能出去的,只能忍着等到你买完后从护栏前面出去

银行一进来很豪华是吧,没有像这样的弄两个栏杆子,它门口会有一个叫号器,那么这个东西干什么呢?这个东西啊它非常关键也非常重要,对我们来说呢,比售票处要先进一点,或者说对我们每个人来说呢,能够节约我的时间。
你原来你进来是不是要排队啊?你排队这里你在这个在那里面想出去,前面有人想想想从后面出去不行,是不是挡着。现在就不同了,你一进来啊要办理业务,一进来的话,先不管三七二十一,先取个号,取个号的话呢,这个时候你就爱干嘛干嘛了,我们等着。然后呢这边这个工作人员他如果说前面的办理完,办理完业务了没人了,他就会按一下那个有个按钮按一下某某某号,那这时候呢你就可以进去办理业务,那么你在这个时间的话呢,你就不用说是在这儿排队等了,你上厕所不影响
那么注意这个起取号器谁做的里面要不要程序呢?需要的是不是里面的程序是怎么做的?什么样的一个思路呢?那这其实就是什么利用了我们这个数据结构的队列的这个思想,

其实上面的两种案例都体现了一个队列这么一个概念。

队列的特征

特殊的线性表,先进先出(FIFO)

  1. 数据:
    对于非空的队列,表头没有直接前驱,表尾没有直接后继,其它有且仅有一个直接前驱和一个直接后继。
  2. 操作:
    只允许在表尾插入数据,在表头删除数据。

队列——顺序存储

顺序存储怎么存,它的特点是什么呢?逻辑上的先后次序把他们依次的存储在一块连续的空间里面。这是我们说的顺序的这个特点啊,那么我们如何去存呢?

首先得有这样一个结构的数据,那么我们要将这组数据存在连续存的空间里面,显然我们先要申请一块连续空间,进而才能存储,所以对列的顺序里面要有一块连续的空间

然后呢,我们要有front,rear两个数据的空间,我们就可以通过这两个数据来确定我这个队列中有多少个元素,那么要出队的话,通过的front来进行出队,那么入队的话,我们通过rear入队

front 和rear 其实起到一个非常重要的数据管理作用,所以我们通常把他们两个数据和我们这个存储数据的空间,给它封装在一起。

在c语言中,封装数据用结构体,封装代码用函数。

定义队列结构体

#define MAXSIZE 64      //定义队列的容量
typedef int datatype;   //定义队列中数据元素的数据类型
typedef struct
{ datatype data[MAXSIZE];   //用数组作为队列的存储空间int front,rear;     //指示队头前一个位置和队尾位置的指针
}sequeue;    //顺序队列类型定义
sequeue *sq;  //定义指向顺序队列的指针

这些数据结构,链表,栈,队列等都作为一个工具,
它第一:可以存储数据
二:管理(处理)数据

队列顺序存储基本算法分析

  1. 初始化
    申请顺序队列的空间:malloc
    确定front和rear的位置。(空队列时,让front = rear= -1

  2. 入队
    一:rear++
    二:data[rear]=value;
    三:若空间满了,再入队,就不行了没空间了 if(rear == MAXSIZE-1)
    改进:
    一:rear=(rear+1)%MAXSIZE
    二:data[rear]=value;

  3. 出队
    一:front++
    二:data[front] ->出队

    三:(假溢出)若空间没有元素了或者只有一个元素了,front=5,正常我们应该还能入队,还有空间,但是rear=6,还是队满的。就矛盾了。
    改进:
    一:front=(front+1)%MAXSIZE
    二:data[rear]=value;

  1. 判断队空

  2. 判断队满

队列顺序存储基本算法实现

创建队列

两种创建队列的方法,只是返回的不同
#include"sequeue.h"seq_pqueue init_sequeue(){seq_pqueue q;q = (seq_pqueue)malloc(sizeof(seq_queue));if(q == NULL){perror("malloc");exit -1;}q->front = q->rear = MAXSIZE-1;return q;
}******************************************************
void  init_sequeue(seq_squeue *Q){*Q = (seq_pqueue)malloc(sizeof(seq_queue));if((*Q) == NULL){perror("malloc");exit -1;}(*Q)->front = (*Q)->rear = MAXSIZE-1;return *Q;
}

判断队满

bool is_full_sequeue(seq_sequeue(q)){if((q->rear+1)%MAXSIZE == q->front){return true;}else{return false;}
}

入队操作

bool in_squeue(datatype value , seq_sequeue q){//判断队列是否为满if(is_full_sequeue(q)){printf("sequeue is full\n");return false;}//入队q->rear = (q->rear+1)%MAXSIZE;q->data[q->rear] = data;return true;
}

判断队空

bool is_empty_sequeue(seq_sequeue(q)){if(p->rear == p->front){return true;}else{return  false;}
}

出队操作

bool out_sequeue(seq_sequeue q ,datatype *D){//判断队列是否为空if(is_empty_sequeue(q)){printf("sequeue is empty\n");return false;}//出队q->rear = (q->rear+1)%MAXSIZE;*D = q->data[q->front];return frue;
}

顺序队应用

-------------------------------------------------很棒学习完了数据结构的 队列--------------------------------------------------

------------------------------------------------------------下期预告:二叉树------------------------------------------------------

数据结构——“队列 队列的应用“ 详细图解和代码示例 (没更新完)相关推荐

  1. 【OS系列-2】- 进程详细讲解(代码示例)

    进程 进程详细讲解(代码示例) 进程 示例代码 创建进程的具体过程? 执行 fork()的时候系统做了什么? 进程间通信 管道 消息队列 共享内存 信号量 套接字 进程间同步 信号量 文件锁 无锁 C ...

  2. python pyqt教程_python使用PyQt5的详细教程(代码示例)

    本篇文章给大家带来的内容是关于python使用PyQt5的详细教程(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:安装PyQt5pip install pyqt5 二 ...

  3. 数据结构 —— 单链表(超详细图解 接口函数实现)

    系列文章目录 数据结构 -- 顺序表 数据结构 -- 单链表 数据结构 -- 双向链表 数据结构 -- 队列 数据结构 -- 栈 数据结构 -- 堆 数据结构 -- 二叉树 数据结构 -- 八大排序 ...

  4. JDK7新特性详细说明及代码示例

    在2011年7月28日,Oracle发布了JDK7的正式版.最近我从网上搜集了一些资料,把文字说明和代码示例结合起来,方便我们的学习. 下面我们来看看JDK7比6多了哪些新特性 1.访问文件系统 与之 ...

  5. 数据结构(严蔚敏C语言版)代码实现持续更新中

    文章汇总: 线性表: 线性表的顺序表示和实现 线性表的链式表示和实现 静态链表的表示和实现 栈: 顺序栈--栈的顺序表示和实现 链栈--栈的链式表示和实现 队列: 链队列--队列的链式表示和实现 顺序 ...

  6. 【手写数据结构】双链表最详细图解

    原创公众号:bigsai 原创不易,如果有收获请不要吝啬你的一键三连! 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以 ...

  7. 【学习笔记】rabbitmq设置队列ttl和使用延迟插件的代码示例

    文章目录 设置队列ttl 配置文件 生产者 消费者 设置消息ttl 延迟插件的使用 修改配置文件 修改生产者 修改消费者 设置队列ttl 代码架构: 创建两个队列QA和QB,两者队列TTL分别设置为1 ...

  8. Spark数据倾斜-采样倾斜key并分拆join操作-详细图解与代码

    本文修改自[1]中的方案六. 下面的方案简述来自[1] 方案适用场景:两个RDD/Hive表进行join的时候,如果数据量都比较大,无法采用"解决方案五",那么此时可以看一下两个R ...

  9. 冒泡排序(超详细图解加代码解析,5分钟看懂)

    目录 1.冒泡排序的定义 2.冒泡排序的原理 3.代码及其解析 4.冒泡排序的改进 5.实现冒泡排序函数 生命中永远会有令人懊恼的事,但我知道,我们是为了不留遗憾活着的,对吗? 1.冒泡排序的定义 冒 ...

  10. SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)

    准备工作# 环境准备# JAVA版本 Copy java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1. ...

最新文章

  1. apk反编译工具-apktool
  2. lamp 独立mysql_lamp or lnmp 环境搭建之独立安装mysql数据库
  3. PAT甲级1073 Scientific Notation:[C++题解]字符串处理、科学计数法
  4. BZOJ4127Abs——树链剖分+线段树
  5. 向量合并 matlab,MATLAB追加向量
  6. 让我们了解下什么是智能客服(问答)
  7. Visual Studio Code中的无标题(工作区)
  8. 教你正确设置CrossOver的Wine配置(三)
  9. 日语输入法电脑版_攻略!教你如何用手机打日语
  10. Java容器---List
  11. RS232和RS485的协议原理及应用
  12. css 平移到某个位置_CSS3 对象平移translate()translatex()translatey()应用实例,包括水平垂直居中...
  13. MathType批量修改公式字体和大小
  14. HDOJ 5144 NPY and shot 简单物理
  15. 绪论——信息理论学与量子信息学
  16. 记Global Protect安装的一次坑旅
  17. 万达VS银泰 谁是最后的赢家?
  18. Day462.MySQL数据类型约束 -mysql
  19. unity打开word pdf 等其他格式
  20. 个人账目管理系统(一)数据库连接

热门文章

  1. 使用EasyExcel的模板导出复杂表头的Excel- 先单组数据填充,再多组数据填充
  2. 中国科学家dna计算机,我国首台DNA计算机问世
  3. Arcgis空间连接
  4. itext linux 中文乱码_itext linux 中文
  5. c语言中char ch和getchar()是什么意思?
  6. 使用手册 煤矿风险管控系统_煤矿风险分级管控手册.doc
  7. 自控力 笔记10 结语 完结篇
  8. IE主页被https://hao.360.cn/?a1004劫持,如何解决
  9. 你用过Foxpro吗?
  10. SQL查询左连接、右连接、内连接