一、队列

1、队列的概念

队列是一种“先进先出(first in first out)”的数据结构,它是一种有序线性表的抽象数据类型、队列在计算机 领域的应用也相当的广泛,例如计算机的模拟(simulation)、CPU的作业调度(Job Scheduing)、外围设备联机并发处理系统(spooling)的应用与图遍历运算等

2、队列的基本操作

在操作队列的时候,使用数组和链表都可以,最重要的是要遵循“先进先出”的原则,常见操作如下:

二、使用数组实现队列

#define MAXSIZE 4

int queue [ MAXSIZE ] ; //队列大小

int front = -1;

int rear = -1;

1、开始时候,将front与rear都预设为-1,当front = rear时,则为空队列

2、加入dataA,front = - 1 ,rear = 0 ,每加入一个元素,将rear值加上 1

3、加入dataB、 dataC,front = -1 ,rear = 2

4、取出dataA,front = 0 ,rear = 2,每取出一个元素,将front值加1

队列操作代码;

#define MAX_SIZE 100;//队列的最大容量

int queue[MAX_SIZE ];

//空队列的时候,front = -1 ,rear = -1

int front = -1;

int rear = -1;

【1】将数据加入队尾

void enqueue(int item )

{

if ( rear == MAX_SIZE – 1 )

{

cout<

}else{

rear ++;

queue[rear] = item;

}

}

【2】删除队列前端的数据

void delqueue(int item){

if(front == rear)

{

count << “队列已空”;

}else{

front + +;

item = queue[front];

}

}

【3】删除队列前端的数据

void front_value(int * queue){

if (front == rear ){

count <

}else{

cout << queue[front];

}

}

使用数组操作队列实例代码:

/*

[示范]:实现队列数据的进队和出队

*/

#include

using namespace std;

const int MAX=20;//定义队列的大小

int main(void)

{

int front,rear,val,queue[MAX]={0};

char ch;

front=rear=-1;

while(rear

{

cout<

cin>>ch;

switch(ch)

{

case 'I':

cout<

cin>>val;

rear++;

queue[rear]=val;

break;

case 'G':

if(rear>front)

{

front++;

cout<

cout<

queue[front]=0;

}

else

{

cout<

exit(0);

}

break;

default:

cout<

break;

}

}

if(rear==MAX-1) cout<

cout<

if (front>=rear)

{

cout<

cout<

}

else

{

while (rear>front)

{

front++;

cout<

}

cout<

}

system("pause");

return 0;

}

三、使用链表实现队列操作

使用链表存储详见程序

四、队列的顺序存储

实际中要使用链式存储,因为顺序存储会出现“假溢出现象”

假设一个队列有n个元素,则顺序存储,如下图所示:

从上面可以看出入队操作就是在队尾追加一个元素,不需要任何移动,时间复杂度为O(1)。出队则不同,因为已经假设下标为0为对头,所以每次出队列操作所有元素都要向前移动,按照刚才的方式,出队列的时间复杂度为O(n),效率降低。如果我们不去限制队头位置在下标为0的位置,那么出队列的操作就不需要移动全体元素(详见后面的循环队列)

出队列如果不限制队头的话,可以使用个队头指针,如下图:

但是这样也会出现一些问题,例如按下边的情况继续入队,就会出现数组越界的错误

可事实上,还有0、1两个位置,没有使用,故这是“假溢出”,解决方案---后面的循环队列

五、循环队列

循环队列将专门设个专题来讲解,这里是些基本的概念。

要解决假溢出的现象,就是如果后面的满了,就再从头开始,也就是头尾相连的循序。循环队列它的容量是固定的,它的队头指针和队尾指针都可以随着元素入出队列而发生改变

以入队操作为例,当需要将元素入队操作可按以下步骤进行:

(1)将队尾序号tail增加1,即 tail = tail + 1

(2)若tail = n + 1,则tail = 1

其实,前两步可以使用以下表达式进行计算:

tail = ( tail + 1 ) % n

队列的基本操作_算法设计:数据结构-队列相关推荐

  1. 队列的基本操作_算法与数据结构(五) 栈和队列

    ? 工欲善其事,必先利其器. 栈和队列 - Stack And Queue 栈 如何理解栈呢? 后进者先出,先进者后出,这就是典型的 "栈" 结构. 04_栈和队列-栈结构 从栈的 ...

  2. dhu 4.1 队列模板简单应用算法设计:士兵队列训练

    队列模板简单应用算法设计:士兵队列训练 时间限制: 1S类别: DS:队列->队列定义及应用 晚于: 2022-05-04 23:55:00后提交分数乘系数50% 截止日期: 2022-05-0 ...

  3. java使用队列实现栈思路_算法面试:队列实现栈的方案

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇介绍的是如何用两个队列实现栈的问题.这道题作为上一篇文章算法面试:栈实现队列 ...

  4. 顺序队列模板简单应用算法设计:农夫过河(这个比较难,我自己都觉得难)

    文章目录 问题描述 : 输入说明 : 输出说明 : 输入范例 : 输出范例 : 思路分析 伪码实现 事故现场 第一次提交 分析与总结 如有不妥,或者疑问,请加扣扣651378276,一起商议学习进步 ...

  5. 队列模板简单应用算法设计:士兵队列训练

    问题描述 : 目的:使用C++模板设计队列(链队列和顺序队列)的抽象数据类型(ADT).并在此基础上,使用队列ADT的基本操作,设计并实现简单应用的算法设计. 内容:(1)请参照栈的ADT模板,设计队 ...

  6. 考研复试 算法设计数据结构

    算法的基本概念和特性 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作. 算法的五个特性: 输入: 算法具有0个或多个输入 输出: 算法至少有1个或多个输出 有 ...

  7. socketmq 设置队列大小_LeetCode 622:设计循环队列 Design Circular Queue

    LeetCode 622:设计循环队列 Design Circular Queue 首先来看看队列这种数据结构: 队列:先入先出的数据结构 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素 ...

  8. 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  9. 利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...

    本文将会以插入排序为例,介绍算法与数据结构的基础部分. 插入排序 排序可以说是整个算法中最为基础,最为重要的一部分,而插入排序正是排序算法中最简单的一种解决办法. 什么是排序问题? 输入:n个数的一个 ...

最新文章

  1. C++ 泛型编程 -- 函数模版
  2. java web 教案_《Java web程序设计》教案.pdf
  3. 07-XML 文件注解开发
  4. JVM内存模型:运行时栈帧结构
  5. Java IO流之普通文件流和随机读写流区别
  6. MySQL通过两表避免回表_mysql利用覆盖索引避免回表优化查询
  7. OpenCV4每日一练day5:图像读取、显示与保存
  8. Android:随笔—— ConstraintLayout 效率爆表的技巧
  9. 星型模型 3nf的区别_数据库和数据仓库的区别和联系
  10. Flink – submitJob
  11. android盒子多个DLNA冲突,说说DLNA、AirPlay 、Miracast那点事
  12. 提升PPT逼格的利器!只需1招,让PPT页面化腐朽为神奇~
  13. 新型软件生命周期模型-RUP统一过程模型 迭代增量
  14. 数学分析_Tom Apostol_定理7.48:黎曼可积的充要条件
  15. 深入理解FPGA加速原理——不是随便写个C代码去HLS一下就能加速的
  16. 结对编程之经验教训总结
  17. 图片LSB隐写(java)
  18. 华为手机如何设置主页面_华为手机怎么返回主界面
  19. (附源码)node.js中小学生中文写作网 毕业设计 250623
  20. CNN做时间序列预测_深度学习与时间序列预测

热门文章

  1. 别在我的坟前哭 脏了我轮回的路
  2. postgreSQL源码分析——索引的建立与使用——各种索引类型的管理和操作(2)
  3. 4-2-在Servlet中解决中文输出乱码问题
  4. linux端口混杂模式,linux端口混杂模式简介~
  5. python求完全平方数_【Python】【demo实验6】【练习实例】【完全平方数相关】
  6. 至诚学院MATLAB第四次,MATLAB 第二次实验课课堂作业(4学时)
  7. python super().__init__()_python——多继承使用super().__init__ 发生的状态
  8. c语言题目1120,九度题目1120:全排列
  9. 创意三维c4d形式设计节气海报学习案例
  10. UI设计灵感|时尚简约风格网页页面设计