C/C++队列与循环队列

C/C++数据结构 - 队列 循环队列

快速入门

介绍

1. 队列的定义

队列是一种线性存储结构,每次对队列的增删操作如下

  • 增:在队列尾部添加元素

  • 删(取出):在队列头部删除元素

    这种数据存储方式遵循“先进先出”(First In First Out)的原则,简称FIFO结构;

2.队列的相关概念

(1)队头

(2)队尾

(3)空队列

(4)满队列

3. 队列相关操作

(1)入队:push()

(2)出队:pop()

(3)统计队列元素个数:countSize()

(4)判断队列是否为空:isEmpty()

(5)获取队头: getFront()

(6)获取队尾:getBack()

示例代码1:C++库函数举例

C++队列queue模板类的定义在<queue>头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。

1. 头文件,队列声明,队列方法

#include <queue>queue<int> q;
int i = 10;q.push(i)               在队尾压入新元素
q.pop()                 删除队列首元素但不返回其值
q.size()                返回队列中元素的个数
q.empty()				如果队列为空返回true,否则返回false   
q.front()               返回队首元素的值,但不删除该元素
q.back()                返回队列尾元素的值,但不删除该元素

2.示例

#include <iostream>
#include <queue>
#include <string>using namespace std;int main()
{queue<int> my_q;string log;	for (int i = 0; i < 10; i++) {my_q.push(i);}cout << "the front of q is " << my_q.front() << endl; // 返回定义类型cout << "the back of q is " << my_q.back() << endl; // 返回定义类型log = my_q.empty() == true ? "empty":"not empty"; // 返回布尔cout << "my_q is " << log << endl;cout << "my_q size is " << my_q.size() << endl; // 返回整数while(!my_q.empty()) {cout << "cur pop data =  " << my_q.front();my_q.pop(); // 无返回值cout << " is poped" << endl;}return 0;
}

示例代码2:C语言静态队列(循环队列,定长队列)

C语言中,如果采用固定长度的一维数组来实现队列,通常使用循环队列的形式,避免普通队列由于顺序存储导致执行操作POP出队时带来的时间花费问题:每次从数组头部删除元素(出队)后,需要将头部以后的所有元素往前移动一个位置,这是一个时间复杂度为O(n)的操作。

循环队列的具体原理可以参考:

https://blog.csdn.net/li1914309758/article/details/81363166

由于循环队列存在弊端:

当队空时:front=rear
当队满时:front=rear 亦成立
因此只凭等式front=rear无法判断队空还是队满。 有两种方法处理上述问题:
(1)另设一个标志位以区别队列是空还是满。
(2)少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位置上”作为队列“满”状态的标志。即:
队空时: front=rear
队满时: (rear+1)%maxsize=front

1. 头文件定义

本示例代码采用第一种方式处理循环队列的队空队满问题。

typedef struct _queue {enum QUEUE_TYPE type;int qcapacity; // 容量int qsize; // 当前队列数据的数量int front; // 队头int back; // 队尾int *qdata;
} Queue;

2. 源文件

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include "DH_queue.h"static Queue *static_queue(int len)
{Queue *queue = (Queue *)malloc(sizeof(Queue));memset(queue, 0, sizeof(Queue));queue->qcapacity = len;queue->qsize = 0;queue->front = 0;queue->back = 0;queue->qdata = (int *)malloc(sizeof(int) * len);memset(queue->qdata, 0, sizeof(int) * len);return queue;
}static int static_countSize(Queue *q)
{return q->qsize;
}static bool static_isEmpty(Queue *q)
{if (q->qsize == 0) {return 1;    }return 0;
}static bool static_isFull(Queue *q)
{if (q->qsize == q->qcapacity) {return 1;}return 0;
}static int static_getFront(Queue *q)
{return q->qdata[q->front];
}static int static_getBack(Queue *q)
{int index = ((q->back == 0) ? q->qcapacity - 1 : q->back - 1);return q->qdata[index];
}static bool static_push(Queue *q, void *data)
{if (q->qsize == q->qcapacity) {printf("queue is full, push fail\n");return false;}q->qdata[q->back] = *(int *)data;q->qsize += 1;q->back = (q->back + 1) % q->qcapacity;printf("q->back = %d", q->back);return true;
}static bool static_pop(Queue *q, int *data)
{if (q->qsize == 0) {printf("queue is empty, pop fail\n");return false;}int tmp = 0;tmp = q->qdata[q->front];q->qsize -= 1;q->front = (q->front + 1) % q->qcapacity; return true;
}// 主函数:测试代码
int main()
{// 创建队列Queue *my_queue = static_queue(5);// 入列for (int i = 0; i < 6; i++) {printf("= %d\n", static_push(my_queue, &i));}// 遍历for (int i = 0; i < 5; i++) {printf("%d\n", my_queue->qdata[i]);}// 队头和队尾printf("my_q front = %d, get front = %d, back = %d, get back = %d\n", my_queue->front, static_getFront(my_queue), my_queue->back, static_getBack(my_queue));// 容积和队列元素printf("my_q capacity = %d, qsize = %d\n", my_queue->qcapacity, my_queue->qsize);// 队空和队满printf("my_q isEmpty = %d, isFull = %d\n", static_isEmpty(my_queue), static_isFull(my_queue));// 出队列for (int i = 0; i < 6; i++) {printf("= %d\n", static_pop(my_queue, &i));}return 0;
}

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

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

相关文章

PyQt特殊对话框介绍

PyQt特殊对话框 对话框基类&#xff1a;QDialog 对话框基本用法&#xff1a; 模态窗口&#xff1a; 当窗口设置为模态窗口时&#xff0c;不能对其父级别的窗口进行操作。QTdesigner里有控件可以勾选Func: QtWidgets.Dialog.setModal(True) [ True | False ] 窗口执行 exec&am…

PyQt5 让窗口在桌面居中的办法

屏幕居中核心函数 在我们开发的UI类中定义一个center方法&#xff0c;&#xff08;方法名自定&#xff0c;内容如下&#xff09;。其中QDesktopWideget方法在Qtwidgets头文件中。 然后在 __init__()中调用该 self.center()方法即可。 # 屏幕居中def center(self):# 获取窗口大…

PyQt5 QLineEdit输入密码

单行编辑器 QLineEdit 输入密码 单行编辑器直接继承于QWidget 常用方法&#xff1a; 设置显示模式&#xff1a;在设置密码栏常会使用这种模式 方法QLineEdit.setEchoMode 用法 假设你有一个QLineEdit()组件 self.UserpswdEdit QLineEdit()则你可以使用下面三种方式定义输…

Arduino 软件开发(一): GPIO读写

Arduino 软件开发&#xff08;一&#xff09; 目录 核心运行函数&#xff0c; 基础语法&#xff0c;数字控制&#xff0c;模拟控制 核心运行函数 void setup() 当Arduino程序开始运行时会调用setup()函数。通常setup()函数完成初始化一些变量、配置引脚状态及初始化调用的库…

JavaScript学习笔记:类与导包实例

NodeJS类与导包 在工程上&#xff0c;一个文件就是一个独立的模块&#xff0c;仅包含一个类。我们可以称之为类文件。因此当我们要使用这个模块的时候&#xff0c;我们会将这个类文件作为一个包导入到调用的文件里。方法如下&#xff1a; 0. 目录结构如下 - src|__ main.js|…

JavaScript学习笔记:常量,枚举,宏定义

NodeJS常量&#xff08;fake&#xff1a;宏定义&#xff09; 因为之前C/C代码开发习惯了&#xff0c;会用到一些宏定义来替换一些表意不明的数字&#xff08;就是含义不清的数字&#xff09;。而JS没有这种宏定义。上网找到一个链接作为参考&#xff1a;https://www.itranslat…

JavaScript学习笔记:函数与箭头函数

NodeJS函数 由于js是弱语言&#xff0c;因此&#xff0c;函数的入参和出参可以为任意形式而不用指定类型。当然也没有办法使用冒号的形式进行参数类型注释。但是typescript可以使用冒号形式进行参数类型注释。 1. 普通的函数定义 不带参数形式printHello带参数形式plus使用re…

Python学习笔记(1):用户输入,终端输入

#用户输入&#xff0c;操作 print("python 用户输入操作")# input(提示字符串)&#xff0c;函数阻塞程序&#xff0c;并提醒用户输入字符串 instr input("please input the string: ") print("input >> " instr)# 将输入的字符串转化成整…

Python学习笔记(2):生成器

介绍 我们可以通过列表生成式简单直接地创建一个列表&#xff0c;但是受到内存限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用很大的存储空间&#xff0c;而且如果我们仅仅需要访问前面几个元素&#xff0c;那后面…

Python学习笔记(3):zipfile解压库

简介 python自带zipfile解压库&#xff0c;导入方式如下 import zipfile批量解压 先尝试无密码解压&#xff0c;如果失败&#xff0c;就输入密码。但是zipfile解压大文件速度很慢。 path rL:/resource/zipPackage passwd b123456 def compressFromZip():for temp_name in…

数字万用表使用方法

数字万用表使用方法 简介&#xff1a;数字万用表相对来说&#xff0c;属于比较简单的测量仪器。本篇&#xff0c;作者就教大家数字万用表的正确使用方法。从数字万用表的电压、电阻、电流、二极管、三极管、MOS场效应管的测量等测量方法开始&#xff0c;让你更好的掌握万用表测…

Python学习笔记(4):Python如何设置类似C语言静态函数

介绍 模块封装时候&#xff0c;希望有一些函数不被外部直接调用。C语言通常采用static int function()形式以及头文件形式作为标识。而python不存在头文件&#xff0c;但可以通过修饰符staticmethod进行代替。 staticmethod def your_function():# 你的代码print("your …

c++ 字符串相等比较

介绍 在C 中比较字符串的技术 (Techniques to Compare Strings in C) Strings in C can be compared using either of the following techniques: 可以使用以下两种技术之一来比较C 中的字符串&#xff1a; String strcmp() function 字符串strcmp&#xff08;&#xff09;函…

ffmpeg下载安装 多段ts视频m3u8下载

如何下载多段ts视频 m3u8 ffmpeg ffmpeg使用教程 下载 Windows下载方法 step1. 官网下载地址 点此进入下载地址 step2. 选择 Windows EXE files 中的Windows builds by BtbN 这会跳转到github页面中。 step3. 选择对应的linux平台或者windows平台进行下载 安装 step1.…

linux环境下安装多个任意版本的python环境

linux环境下安装多个任意版本的python环境 安装方法可以归结为 [下载 编译 配置环境变量] 下载Python 参考链接&#xff1a; .任意python版本下载&#xff0c;所有python版本下载的FTP路径 Windows下载发送到linux上 step1. 下载linux版本的python 从Python官网进入 选择…

linux云服务器状态上报解决方案:外发个人邮箱

linux云服务器状态上报解决方案&#xff1a;外发个人邮箱 需求如下&#xff1a; #### 将一些服务器的关键日志实时发送到手机上一些案例&#xff1a; CPU状态检测 解决方案&#xff1a; #### 利用mailx命令外发邮件方法如下&#xff1a; 1. 用管理员打开mail配置文件 >…

Matplotlib画图教程:在QT界面中嵌入三维图片

Matplotlib画图教程&#xff1a;在QT界面中嵌入三维图片 需求&#xff1a; 做项目报告的时候&#xff0c;有这么一个想法&#xff0c;就是能通过UI随时调用matplotlib进行二维图和三维图的绘制。因此就诞生了做这么一个小模块的想法。 这里先上一下最终结果&#xff1a; 思…

Python工程笔记(1):轨迹与日志

轨迹记录模块&#xff08;Recorder&#xff09; 轨迹和日志是定位工程问题的备忘录和总结代码开发项目管理经验的基本素材&#xff0c;是工程交验收资料的重要组成部分 1.1 依赖表 包名含义安装方式系统包ostime 1.2 全局变量表 变量名含义初值log_file日志保存路径./recor…

Python代码优化(1):天气预报获取

天气预报获取模块 基于http://www.weather.com.cn/做了代码优化&#xff0c;每个函数功能更加明确&#xff0c;更加适合单独集成。接口也进行了优化&#xff0c;比网络上博主抄来抄去的源码要好一些。 改进点&#xff1a;获取天气拆成了多个函数&#xff0c;多次保存csv文件不…

proxy_pool开源项目攻克学习

开源项目攻克学习之proxy_pool 1. 学习背景 爬虫线程池&#xff0c;但是网络上付费的又很麻烦&#xff0c;于是在开源网站上找到一个版本进行学习。 https://github.com/jhao104/proxy_pool 本人操作系统deepin&#xff0c;有遇到一些问题&#xff0c;希望可以跟大家分享一…