码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据结构02 队列及其应用【C++实现】


     这是《C++算法宝典》数据结构篇的第02节文章~

    如果你之前没有太多C++基础,请点击👉专栏:C++语法入门,如果你C++语法基础已经炉火纯青,则可以进阶算法👉专栏:算法知识和数据结构👉专栏:数据结构啦

    目录

    📕队列及其特点

    📕利用数组模拟队列的基本操作

    创建队列

    空队条件

    元素入队

     元素出队

    📕模拟超市收银问题

    📕队列操作

    初始化

    入队操作

    出队操作

    取出队首元素

    STL模板中队列的基本使用

    🧠训练:约瑟夫问题

    参考程序


    队列及其特点

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,前端一般叫做队头,后端叫队尾。队列就像学校做操站队一样,来的人一个一个往后站,走的时候从前往后一个一个走。

    总结队列的特点为:先入先出,即先入队的元素先出队。

    利用数组模拟队列的基本操作

    对于队列的使用,我们可以直接利用数组来模拟队列的基本操作,具体实现如下:

    创建队列

    1. int que[105]; //定义一个能存放105个数字的数组来模拟队列
    2. int front=0,rear=0; //front与rear分别表示队头和队尾元素的位置。

    空队条件

    front==rear;
    

    元素入队

    que[rear++]=x;    //元素x入队
    

     元素出队

    x=que[front++];  //队首元素出队,并将元素值赋值给x
    

     模拟超市收银问题

    假设有一批顾客来到超市,在结账时,必须排队付款。先到达收银台的顾客先结账。

    我们模拟收银过程,使用队列来实现,一般队列会提供以下几个功能:

    1. push(x):将x压入队列,即顾客来排队,应该站在队尾。
    2. pop():弹出队首元素,即排在最前面的人结完账后,离开队列。
    3. front():查询队首元素,即知道目前是谁结账。

    队列操作

    初始化

    1. const int MAXN=1100;
    2. int que[MAXN];
    3. int head = 0;
    4. int tail = 0;

    入队操作

    1. void push(int x){
    2. if(tail>=MAXN) printf("队列溢出");
    3. else{
    4. que[tail] = x;
    5. tail++;
    6. }
    7. }

    出队操作

    1. void pop(){
    2. if(head==tail) printf("队列为空");
    3. else head++;
    4. }

    取出队首元素

    1. int front(){
    2. if(head==tail) printf("队列为空");
    3. else return que[head];
    4. }

    STL模板中队列的基本使用

    对于队列的使用,我们也可以直接利用STL模板来实现,STL模板库中队列的基本操作如下:

    头文件:#include

    创建一个存放int类型数据的空队列s:queue s;

    s.empty():  判断队列是否为空,为空返回true,否则返回false;

    s.size():  返回队列中元素的个数;

    s.front():  获取队首元素的值;

    s.back():  获取队尾元素的值;

    s.push(k):   向队尾插入新的元素k;

    s.pop():    删除队列s的队首元素。

    训练:约瑟夫问题

    n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

    【输入描述】n和m

    【输出描述】出列的顺序

    【输入样例】4 17

    【输出样例】1 3 4 2

    参考程序

    1. #include<iostream>
    2. #include<queue>
    3. using namespace std;
    4. queue<int> que;
    5. int m,n;
    6. int main(){
    7. cin>>n>>m;
    8. for(int i=1;i<=n;i++) que.push(i); //编号入队
    9. int k=1;
    10. while(!que.empty()){
    11. if(k==m){ //数到了m
    12. cout<<que.front()<<" "; //输出
    13. que.pop(); //出队
    14. k=1; //再次初始化k
    15. }
    16. else{
    17. que.push(que.front());//队首放到队尾
    18. que.pop(); //出队
    19. k++;
    20. }
    21. }
    22. return 0;
    23. }

    从C++入门到算法,再到数据结构,查看全部文章请点击此处icon-default.png?t=N7T8http://www.bigbigli.com/

  • 相关阅读:
    如何加快发明专利的审查时间
    假如我是核酸系统架构师,我会...
    在Ubuntu 14.04上如何安装 WordPress 教程
    深度学习(part8)--CNN卷积神经网络
    2022国际数维杯C题题解:利用大脑结构特征和认知行为特征诊断阿尔茨海默病
    最新Spring 6手写实现Sping IOC保姆级教程
    js运动雏形及其相关问题和运动框架
    华为配置中心AP内漫游实验
    Spring Bean生命周期|分析|图解
    Windows Terminal远程连接阿里云
  • 原文地址:https://blog.csdn.net/qq_39434533/article/details/139690779
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号