数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

队列

  • 前言
  • 1. 队列介绍
    • 1.1 什么是队列
    • 1.2 队列的性质
    • 1.3 队列的构成
    • 1.4 队列的框架代码(C++版)
  • 2. 队列的操作
    • 2.1 初始化队列
      • 2.1.1 步骤
      • 2.1.2 代码展示
    • 2.2 入队操作
      • 2.2.1 步骤
      • 2.2.2 代码展示
    • 2.3 输出队列中的元素
      • 2.3.1 步骤
      • 2.3.2 代码展示
    • 2.4 出队操作
      • 2.4.1 步骤
      • 2.4.2 代码展示
    • 2.5 问题分析
  • 3 循环队列
    • 3.1 循环队列与普通队列的不同
    • 3.2 代码实现
    • 3.3 循环队列的扩容
  • 总结

前言

队列是线性表(线性存储结构)中比较特殊的一种,它的特点总结下来就四个字“先进先出”。本文介绍队列以及循环队列

1. 队列介绍

1.1 什么是队列

队列(queue)是一种遵循”先进先出“的存储方式。

如同这个示意图,数据从head开始依次进入队列(入队),取出数据时同样从head开始 依次离开队列(出队)。就像在高铁检票口前排起的一条队伍,先到的人排在前面,后来的人排在队伍的后面(进入队伍不考虑插队),开始检票的时候也是从前往后依次检票(离开队伍)。

队列只是一种对一组数据的处理方式,对于数据的存储既可以采用顺序表的方式也可以采用链表的方式。

本文采用顺序表的方式存储队列中的数据

1.2 队列的性质

  • 新元素插入到队列的末尾

  • 队首元素先离开队列

1.3 队列的构成

  • 队首位置
  • 队尾位置
  • 队列的容量
  • 数据的存储空间

1.4 队列的框架代码(C++版)

#include <iostream>
#include<iostream>
using namespace std;
//
template <typename Type> class Queue {private:Type *data;int head, tail, length;
public:Queue(int new_length);   // 构造函数,初始化队列~Queue();               // 析构函数,回收队列的内存空间bool push(Type val);    // 入队操作void output();           // 输出队列中的元素void pop();              // 出队操作
};

下述的所有代码都是基于这个框架

2. 队列的操作

2.1 初始化队列

2.1.1 步骤

  1. 根据队列的长度为数据申请存储空间
  2. 队伍中没有元素将队首置为0
  3. 将队尾置为-1(当有入队操作时使队尾加1)

2.1.2 代码展示

Queue(int new_length) {data = new Type[new_length];length = new_length;head = 0;tail = -1;
}
~Queue() {delete[] data;
}

2.2 入队操作

bool push(Type val)

val为元素的值

2.2.1 步骤

  1. 首先根据队尾位置判断队列是否存在可用空间
  2. 队尾位置加一,并在此位置插入新元素

2.2.2 代码展示

bool push(Type val) {if (tail + 1 > length) {return false;}data[++tail] = val;return true;
}

2.3 输出队列中的元素

void output()

2.3.1 步骤

  • 从head开始依次输出,直至tail位置。

2.3.2 代码展示

void output() {for (int i = head; i <= tail; i++) {if (i - head) cout << " ";cout << data[i];}cout << endl;
}

2.4 出队操作

void pop();

2.4.1 步骤

  • 直接使队首后移一位

2.4.2 代码展示

void pop() {head++;
}

2.5 问题分析

当队列处于这样的情况时,虽然head前还有两块空间可以使用,但tail + 1 超出了队列的长度,因此程序会判断队列已经没有空间插入元素了,显然这是不合理的。

为了充分利用申请的内存空间,循环队列便应运而生。

3 循环队列

3.1 循环队列与普通队列的不同

循环队列是从普通队列改进而来,因此需要具体分析一下循环队列的行为逻辑。

  1. 当tail处于队列的最尾端,并且head前还有空间可以使用时,tail会跳回到队列申请空间的最前端
  2. 无法通过tail + 1 > length 来判断队列是否已满

需求已经了解,那该如何解决呢?

对于第一点,通过% 操作可以很轻松的实现tail循环到最前端。

第二点只需要在普通队列的基础上添加一个变量count来记录已存储元素的个数,通过这个变量判断队列是否以满。

3.2 代码实现

#include <iostream>
using namespace std;
template <typename Type> class Queue {private:Type *data;int head, tail, length, count;
public:Queue(int length_input) {data = new Type[length_input];length = length_input;head = 0;tail = -1;count = 0;}~Queue() {delete[] data;}// 入队操作bool push(Type element) {if (count >= length) {return false;}tail =(tail + 1) % length;data[tail] = element;count++;return true;}// 输出队列void output() {int i = head;do {cout << data[i] << " ";i = (i + 1) % length;}while(i != (tail + 1) % length);cout << endl;}// 出队操作void pop() {head = (head + 1) % length;count--;}
};

3.3 循环队列的扩容

循环队列的扩容分为三步:

1. 申请一块新的大小合适的存储空间
2. 将原队列的数据转移到新空间内
3. 释放原队列的存储空间
void expand() {Type *old_data = data;data = new Type[length * 2];int i = head;do {cout << data[i] << " ";i = (i + 1) % length;}while(i != (tail + 1) % length);delete[] old_data;
}

总结

本篇文章详细介绍了队列,下篇文章介绍栈。

本文仅为个人的学习总结,欢迎各位大佬勘误。

数据结构 队列学习总结相关推荐

  1. 数据结构环形队列学习(c语言)

    数据结构环形队列学习(c语言) 实现效果 效果模型描述 代码设置队列长度为5,数组实际大小为6(队列长度加1) 黄色方格是队列头,灰色是未被使用内存,蓝色是队列元素 Example1: 当队列添加满元 ...

  2. 数据结构专题-学习笔记:李超线段树

    数据结构专题 - 学习笔记:李超线段树 1. 前言 2. 详解 3. 应用 4. 总结 5. 参考资料 1. 前言 本篇博文是博主学习李超线段树的学习笔记. 2020/12/21 的时候我在 线段树算 ...

  3. ES6基础4(数据结构)-学习笔记

    文章目录 ES6基础4(数据结构)-学习笔记 set map symbol ES6基础4(数据结构)-学习笔记 set //set 数据结构 类似数组 成员信息唯一性var s = new Set() ...

  4. java 数据结构_Java版-数据结构-队列(数组队列)

    前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...

  5. 数据结构——队列的C++实现

    数据结构--队列的C++实现 \qquad队列的创建.判断是否为空或者满.入队和出队操作的C++实现. #include<iostream> using namespace std;//1 ...

  6. java 数据队列_Java 数据结构 - 队列

    Java 数据结构 - 队列 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的. 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构.使用队列时,在一端插入元素,而在另一 ...

  7. 数据结构队列代码_代码简介:队列数据结构如何工作

    数据结构队列代码 Here are three stories we published this week that are worth your time: 这是我们本周发布的三个值得您关注的故事 ...

  8. .Net消息队列学习(一)

     .Net消息队列学习(一)     下面的示例只是涉及到构建发送者,发送复杂消息等操作.这里的复杂消息包括两种,一种是作者自己封装的一个类,获取对话框中的几个文本对话框的值.第二种是Net中自带的类 ...

  9. java循环队列_Java版-数据结构-队列(循环队列)

    前情回顾 在上一篇,笔者给大家介绍了数组队列,并且在文末提出了数组队列实现上的劣势,以及带来的性能问题(因为数组队列,在出队的时候,我们往往要将数组中的元素往前挪动一个位置,这个动作的时间复杂度O(n ...

  10. 第七周--数据结构--队列数组

     /*    *第七周--数据结构--队列数组     *Copyright (c) 2015 烟台大学计算机与控制工程学院    *All right reserved.    *文件名称:li ...

最新文章

  1. 从0梳理1场时间序列赛事!
  2. 服务器共享文件夹 关闭打开文件,dos命令net file图文教程,显示打开共享文件名关闭删除文件锁...
  3. java classloader_Java Classloader原理分析
  4. 【litrpa专题】首个rpa程序,使用litrpa采集百度地图地铁数据
  5. http服务器网站打不开,网站打不开_ostonkin8743的博客__杭州19楼
  6. Java文档阅读笔记-C3P0连接池的使用
  7. nginx+php-fpm 502 bad gateway
  8. 媒体播放控件的引入 0131
  9. 批处理延迟sleep应用
  10. mongodb更新操作符$rename
  11. 2017年对口招生c语言及答案,2017年计算机专业对口考试试卷及答案.doc
  12. 电子祝福贺卡小程序有哪些?
  13. python字典函数values(),keys(),items()的用法与区别
  14. GaRy-Liang的linux成长日记8-RAID阵列
  15. 快速生成树协议(spanning-tree)
  16. 【Unity ASE学习笔记】
  17. 【趣味科普】数学中的励志故事
  18. Egret性能优化之优化渲染
  19. 单页双曲面 matlab,在matlab中画函数(x^2+y^2)/9-z^2/4=1的旋转单叶双曲面
  20. 计算机组成原理——计算机基本组成

热门文章

  1. Ubuntu关机后自动重启问题的解决方案
  2. VBA写入公式(4):数字转大写金额公式
  3. linux usb 从芯片,新人求教,怎么烧录Linux系统到一个小芯片上?
  4. 前端面试八股文(超详细)
  5. 蚂蚁分类信息系统5.8 短信通道2 互亿无线配置使用说明
  6. ipone 固定底部兼容问题
  7. 怎么样对阿里云ECS主机进行绑定域名
  8. size_t和size_type
  9. 2021全新整合单机游戏 PC电脑版中文合集系列下载持续更新
  10. java 日期 英文月份_java日期月份转英文格式