队列
1.队列的介绍
队列是一种先进先出的数据结构,这和栈有所不同,但又更容易理解。类似于食堂排队打饭,车站排队买票。
后来的人排在队伍最后边,先来的人先打饭或者买票走。如图

队列总是从队尾插入元素,而从队首移除元素,满足先进先出的规则。因此需要一个队首指针front指向队首元素的前一个位置,而使用一个队尾指针rear来指向队尾元素。
,需要一个队首指针front来指向队首元素的前一个位置,而使用一个队尾指针rear来指向队尾元素。和栈类似,当使用数组来实现队列时,队首指针front和队尾指针rear为int型变量(数组下标从0开始);而当使用链表来实现队列时,则为int*型变量的指针。这样当使用数组来实现上面的例子时,队首指针front和队尾指针rear的指向情况如图7-3所示。接下来介绍队列的常用操作,包括清空(clear)、 获取队列内元素的个数(size)、 判空(empty)、入队(push)、 出队(pop)、取队首元素(get_ front). 取队尾元素(get _rear) 等。下面将使用数组q[ ]来实现队列,而int型变量front存放队首元素的前一个元素的下标、rear存放队尾元素的下标(数组下标从0开始)。下面对常见操作进行示范实现:

(1)清空(clear)

使用数组来实现队列时,初始状态为front=-1、rear=-1, 前面的图中第一步rear指向0是因为此时队列中已经有一一个元素了,如果没有元素,rear 应当是指向-1位置的。

void clear()
{front=rear=-1;
}

(2) 获取队列元素的个数(size)
显然 rear-front即为队列元素的个数,从上图很容易看出。

int size()
{return rear-front;
}

(3)判空(empty)
判断队列为空的条件为front==rear.

bool empty()
{ if(front==rear) return true;else return false ;
}

(4) 入队(push)
由于队尾指针rear指向队尾元素,因此把元素入队时,需要先把rear加1,然后再存到rear指向的位置。

void push(int x)
{q[++rear]=x;
}

(5)出队(pop)
可以直接把队首指针加1来实现出队的效果。

void pop()
{front++;
}

(6)取队首元素(get_front)
由于队首指针front指向的是队首元素的前一个元素,因此front+1才是队首元素的位置。

int get_front()
{return q[front+1];
}

(7)取队尾元素,队尾指针指向的是队尾元素,因此可以直接访问rear的位置。

int get_rear()
{return q[rear];}

当然这里我更习惯于另一种写法
给出 模板

//front表示队头,rear表示队尾
int q[N],front = 0, rear = -1;
//向队尾插入一个数
q[++rear] = x;
//从队头弹出一个数
front++;
//队头的值
q[front];
//队尾的值
q[rear];
//判断队列是否为空
if (front <= rear)
{}

实现一个队列,队列初始为空,支持四种操作:

(1) “push x” – 向队尾插入一个数x;

(2) “pop” – 从队头弹出一个数;

(3) “empty” – 判断队列是否为空;

(4) “query” – 查询队头元素。

现在要对队列进行M个操作,其中的每个操作3和操作4都要输出相应的结果。

输入格式
第一行包含整数M,表示操作次数。

接下来M行,每行包含一个操作命令,操作命令为”push x”,”pop”,”empty”,”query”中的一种。

输出格式
对于每个”empty”和”query”操作都要输出一个查询结果,每个结果占一行。

其中,”empty”操作的查询结果为“YES”或“NO”,”query”操作的查询结果为一个整数,表示队头元素的值。

数据范围
1≤M≤100000,
1≤x≤109,
所有操作保证合法。

输入样例:
10
push 6
empty
query
pop
empty
push 3
push 4
pop
query
push 6
输出样例:
NO
6
YES
4

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
const int maxn = 1e5 + 10;
int q[maxn],hh=0,tt=-1;
int main()
{int M;cin >> M;while (M--){string order;int x;cin >> order;if (order == "push")   //插入{cin >> x;q[++tt] = x;}else if (order == "query") //查询队头{cout << q[hh] << endl;}else if (order == "pop")  //弹出队头{hh++;}else{if (hh <= tt){cout << "NO" << endl;}else{cout << "YES" << endl;}}}return 0;
}

STL
(1) push()
push(x)将x进行入队,时间复杂度为0(1).
(2)front()和back()
front()和back()可以分别获得队首元素和队尾元素,时间复杂度为O(1)
(3)pop()
pop()令队首元素出队,时间复杂度为O(1)。

#include<iostream>
#include<queue>
using namespace std;
int main()
{queue<int>q;for (int i = 1; i <= 5; i++){q.push(i);  //将1 2 3 4 5 依次入队}for (int i = 1; i <= 3; i++){q.pop();   //将 1 2 3 依次出队}cout << q.front() << endl; //输出4return 0;
}

(4) empty()
empty()检测队列是否为空,为空返回true,否则返回false,时间复杂度为O(1)。
(5)size()
size()返回queue内元素的个数,时间复杂度为O(1)。

#include<iostream>
#include<queue>
using namespace std;
int main()
{queue<int>q;for (int i = 1; i <= 5; i++){q.push(i);}if (q.empty() == true){cout << "NO" << endl;  //队列非空}cout << q.size() << endl;   //输出5
}

优先队列
priority_ _queue 又称为优先队列,其底层是用堆来进行实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个。例如在队列有如下元素,且定义好了优先级:

桃子(优先级3)
梨子(优先级4)
苹果(优先级1)

那么出队的顺序为梨子(4) →桃子(3)→苹果(1)。

当然,可以在任何时候往优先队列里面加入(push)元素,而优先队列底层的数据结构堆(heap)会随时调整结构,使得每次的队首元素都是优先级最大的。

关于这里的优先级则是规定出来的。例如上面的例子中,也可以规定数字越小的优先级越大(在德国课程中,评分1分为优秀,5、6分就是不及格了)。

1. priority_ _queue 的定义

要使用优先队列,应先添加头文件#include , 并在头文件下面加上“usingnamespace std;",然后就可以使用了。

其定义的写法和其他STL容器相同,typename 可以是任意基本数据类型或容器:priority_ queue< typename > name;

2. priority_ queue 容器内元素的访问

和队列不一样的是, 优先队列没有front()函数与back()函数,而只能通过top(()函数来访问队首元素(也可以称为堆顶元素),也就是优先级最高的元素。

#include <stdio.h>#include <queue>using namespace std;int main() {priority_ queue<int> q;q.push(3) ;q.push(4);q.push(1);printf("%d\n", q.top());   //输出4return 0;

有关优先队列的知识点随后补充。

数据结构 —— 队列相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 数据结构-队列和栈有什么区别

    数据结构-队列和栈有什么区别 1:队列和栈是两种不同的数据结构.它们有以下区别: (1)操作的名称不同.队列的插入称为入队,队列的删除称为出队.栈的插入称为进栈,栈的删除称为出栈. (2)可操作的方式 ...

  8. 数据结构——队列的C语言代码实现

    系列文章目录 数据结构--顺序表的C语言代码实现 数据结构--八种链表的C语言代码实现 数据结构--栈的C语言代码实现 数据结构--队列的C语言代码实现 数据结构--堆的C语言代码实现 文章目录 系列 ...

  9. 数据结构——队列 c++详解

    1.队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点: (1)队列中的数据元素遵循"先进先出"(First In First Out)的原则,简称FIFO结构: (2 ...

  10. C++数据结构——队列

                                                      C++数据结构--队列 参考博客: 数据结构图文解析之:队列详解与C++模板实现 C++ stl队列 ...

最新文章

  1. 中序非递归遍历二叉树
  2. 不自动切换eclipse视图
  3. PHP生成器--动态生成内容的数组
  4. 在Windows下删除Linux系统的方法
  5. Unknown entity (Hibernate的findById方法参数必须加上包名)
  6. 搭建Cocos2d-js开发环境(Window)
  7. OpenCV-图像处理(09、模糊图像二)
  8. 文档数据库和关系数据库的区别
  9. P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
  10. java method方法_java入门(六) | 方法(Method)的定义和使用
  11. 计算机函数求奖学金,Excel函数在高校奖学金评定中的实践应用参考.pdf
  12. html 小游戏 俄罗斯方块
  13. C语言实现扫描文件下所有目录
  14. 手持gps坐标设置_学术 | 许其凤院士:GPS移动定位与移动网络定位精度的分析
  15. 详谈C++11新特性之future及开源项目ananas(folly,std c++11和ananas的future各自的区别是?)
  16. Oracle介绍及视频教程
  17. 后台管理系统色系搭配推荐
  18. 转载CS231n课程学习笔记
  19. svn e170001 authorization failed 的解决
  20. CF346B Lucky Common Subsequence 题解

热门文章

  1. 2021年美赛准备大全
  2. DynDNS免费动态域名解析
  3. 常用元器件的识别与使用(电阻、电容、电感)
  4. 如何在购买笔记本电脑的时候选择配置?这篇笔记本电脑的配置参数解析你值得拥有。
  5. 3.3计算机网络(ALOHA协议 CSMA协议 令牌传递协议 频分时分波分码分)
  6. unity shader development[11]
  7. SQL 存储过程或语句获取月份简写
  8. Qt 给文本添加删除线 text-decoration
  9. docker容器必须要有前台进程
  10. 当C++遇上AUTOSAR编码规范,你的安全我来护航