队列结构

概念:

队列(queue):和栈相似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。一般来说,进行插入操作的一端称为队尾,进行删除操作的一端称为队头。队列中没有元素时成为空队列

队列结构采取“先进先出”的原则处理结点数据。

分类:

以存储结构划分,分为两类:

顺序队列结构

使用一组地址连续的内存单元依次保存在队列中的数据。在程序中,可以定义一个指定大小的结构数组来作为队列。

链式队列结构

使用链表形式保存队列中各元素的值

队列的基本操作:

  • 入队列:将一个元素添加到队尾(相当于到队列最后等候)

  • 出队列:将队头的元素取出,同时删除该元素,使后一个元素成为队头。

队列的程序设计

准备数据:

准备在队列操作中要用到的变量以及数据结构

#define QUEUELEN 15
typedef struct
{ char name[10];
int age;
}DATA;

typedef struct
{
DATA data[QUEUELEN]; //队列数组
int head;
int tail;
}SQType;

这里定义了队列结构的最大长度QUEUELEN,队列结构数据元素的类型DATA以及队列结构的数据结构 SQType 。在数据结构 SQType 中,data 为数据元素,head 为队头的序号,tail 为队尾的序号。当 head=0 时表示队列为空,当 tail=QUEUELEN 时表示队列为满。

初始化队列结构:

创建一个空的顺序队列。步骤如下:

  1. 按符号常量 QUEUELEN 指定的大小申请一块内存空间,用来保存队列中的数据。

  2. 设置 head=0 和 tail=0 ,表示是一个空栈。

初始化顺序队列的示例代码如下:

SQType* SRTpyeInit()
{
SQType* q;

if (q = (SQType*)malloc(sizeof(SQType))) //申请内存
{
q->head = 0; //设置队头
q->tail = 0; //设置队尾
return q;
}
else
{
return NULL; //返回空
}
}

这里采用 malloc() 申请内存,申请成功后设置队头和队尾,返回申请内存的首地址。如果申请内存失败,将返回 NULL

判断队列:

判断空队列

int SQTypeIsEmpty(SQType* q)
{
int temp;
temp = q->head == q->tail;
return temp;
}

在这里,输入一个参数 q 为一个指向操作的队列的指针。程序中,根据队列 head 是否等于 tail ,判断队列是否为空。

判断满队列

int SQTypeIsFull(SQType* q)
{
int temp;
temp = q->tail == QUEUELEN;
return temp;
}

在这里,输入一个参数 q 为一个指向操作的队列的指针。程序中,根据队列 tail 是否等于符号常量QUEUELEN ,判断队列是否为满。

清空队列:

void SQTypeClear(SQType* q)
{
q->head = 0; //设置队头
q->tail = 0; //设置队尾
}

在这里,输入一个参数 q 为一个指向操作的队列的指针。程序中,将队列顶指针 head和 tail 设置为 0,表示执行清空队列操作。

释放空间:

释放队列结构所占用的内存单元。由前面可知,在初始化队列结构时,使用了 malloc() 函数分配内存空间。虽然可以使用清空队列的操作,但是清空队列操作并没有释放内存空间,所以需要用 free() 释放所分配的内存。

void SQTypeFree(SQType* q)
{
if (q != NULL)
free(q);
}

在这里,输入一个参数 q 为一个指向操作的队列的指针。程序中,直接调用 free() 释放所分配的内存。多用于程序结束时。

出入队列:

入队列

将数据元素保存到队列结构。具体步骤如下:

  1. 首先判断队列顶 tail,如果 tail 等于QUEUELEN,则表示溢出,进行出错处理。

  2. 设置 tail=tail+1 (队列顶指针+1,指向入队列地址)

  3. 将队列元素保存到 tail 指向的位置。

代码示例:

int InSQType(SQType* q,DATA data)
{
if (q->tail == QUEUELEN)
{
printf("队列已满操作失败!\n");
}
else
{
q->data[q->tail++] = data; //将元素入队列
return 1;
}
}

出队列

从队列顶弹出一个数据元素。具体步骤如下:

  1. 判断队列 head,如果 head 等于 tail,则表示为空指针,进行出错处理。

  2. 从队列首部取出队头元素(返回队头元素的指针)

  3. 设修改队头 head 的序号,使其指向后一个元素。

代码示例:

DATA* OutSQType(SQType* q)
{
if (q->tail == q->tail)
{
printf("队列已空,操作失败!\n");
exit(0);
}
else
{
return &(q->data[q->head++]);
}
}

读取结点数据

与出队列不同,读结点的操作只是显示内容,而出队列会使该数据不再存在。

代码示例:

DATA* OutSQType(SQType* q)
{
if (SQTypeIsEmpty(q))
{
printf("空队列!\n");
return NULL;
}
else
{
return &(q->data[q->head]);
}
}

在这里,输入一个参数 q 为一个指向操作的队列的指针。程序返回值同样是一个(指向 DATA 类型的指针数据的)指针。


制作:BDT20040

[C++STL] 队列 queue 的入门的更多相关文章

  1. C++ 标准模板库STL 队列 queue 使用方法与应用介绍

    C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...

  2. c++ STL:队列queue、优先队列priority queue 的使用

    说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C ...

  3. STL中的单向队列queue

    转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...

  4. Windows Azure Service Bus (2) 队列(Queue)入门

    <Windows Azure Platform 系列文章目录> Service Bus 队列(Queue) Service Bus的Queue非常适合分布式应用.当使用Service Bu ...

  5. STL学习笔记6 -- 栈stack 、队列queue 和优先级priority_queue 三者比较

    栈stack  .队列queue  和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现 ...

  6. STL中队列queue的用法

    头文件:#include <queue> 建立一个队列queue < 类型 > q 加入一个新的元素q.push(a) 询问队首元素q.front() 弹出队首元素q.pop( ...

  7. Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue

    <Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...

  8. Gengxin讲STL系列——Queue和Stack

    第三篇. 感觉队列和栈是必须的……所以决定加上这两个…… 我发现我已经买域名买上隐了……今天又买了个.top……真是智障…… Queue(队列FIFO)和Statk(栈LIFO). 那么为什么要这两个 ...

  9. STL之Queue(Q)

    STL的Queue(数据结构中的队列): 特点:FIFO 先进先出: 自适应容器(即容器适配器)   栈适配器STL queue  STL中实现的Queue: 用list来实现queue: queue ...

随机推荐

  1. UP9616移动电源快充案例

    第一版的UP9616快充(地址在此 ),从选料到线路板的布局走线都还算不错,实现了当初定下的设计目标,但也有一点小小的遗憾,就是在输出滤波电容这里有点随便了,为了弥补这个遗憾,秉着工程师的" ...

  2. 在页面未加载完之前显示loading动画

    在页面未加载完之前显示loading动画 这里有很多比这篇博客还优秀的loading动画源码 我还参考这篇博客 loading动画代码demo 我的demo预览 <!DOCTYPE html&g ...

  3. 可想实现一个自己的简单jQuery库?(五)

    Lesson-4 这个版本我们要增加一个用的非常多的方法! 那就是each! 我们知道each不仅能遍历数组,还能遍历对象. 首先我们需要一个对数组进行验证的方法 function isArray(o ...

  4. 一个关于小程序与单片机的通信实例(TCP/IP)

    前言 这是一个18年初的创业项目的核心功能要求,我们当时打算做一个共享类的项目,项目的主题是共享图书,线下的形式租借图书,我们当时是考虑做一个借书柜的形式,然后线下生产投放借书柜,这些借书柜本身能存放 ...

  5. 【转】shim.ChaincodeStubInterface用法

    作为记录 shim.ChaincodeStubInterface用法

  6. Docker引擎核心组件

    Docker Engine(Docker引擎)是Docker的核心部分,使用的是客户端-服务器(C/S)架构模式,其主要组成部分如下图所示. 从上图中可以看出,Docker Engine中包含了三个核 ...

  7. 【面试普通人VS高手系列】谈谈你对Seata的理解

    很多面试官都喜欢问一些"谈谈你对xxx技术的理解". 大家遇到这种问题时,是不是完全不知道从何说起. 那么我们来看一下,普通人和高手是如何回答这个问题的? 普通人: Seata是用 ...

  8. Python BeautifulSoup4 爬虫基础、多线程学习

    针对 崔庆才老师 的 https://ssr1.scrape.center 的爬虫基础练习.Threading多线程库.Time库.json库.BeautifulSoup4 爬虫库.py基本语法

  9. CesiumJS 2022^ 原理[2] 渲染架构之三维物体 - 创建并执行指令

    目录 回顾 预备知识:指令 预备知识:通道 1. 生成并执行指令 1.1. Primitive 生成指令 1.2. Context 对象负责执行 WebGL 底层代码 2. 多段视锥体技术 3. 指令 ...

  10. 分布式应用运行时 Dapr 1.7 发布

    Dapr 是一个开源.可移植的.事件驱动的运行时,可以帮助开发人员构建在云和边缘上运行的弹性的.微服务的.无状态和有状态应用程序,并且关注于业务逻辑而不用考虑分布式相关的问题. 分布式相关的问题交给D ...