数据结构 —— 队列
队列
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;
有关优先队列的知识点随后补充。
数据结构 —— 队列相关推荐
- java 数据结构_Java版-数据结构-队列(数组队列)
前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...
- 数据结构——队列的C++实现
数据结构--队列的C++实现 \qquad队列的创建.判断是否为空或者满.入队和出队操作的C++实现. #include<iostream> using namespace std;//1 ...
- java 数据队列_Java 数据结构 - 队列
Java 数据结构 - 队列 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的. 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构.使用队列时,在一端插入元素,而在另一 ...
- 数据结构队列代码_代码简介:队列数据结构如何工作
数据结构队列代码 Here are three stories we published this week that are worth your time: 这是我们本周发布的三个值得您关注的故事 ...
- java循环队列_Java版-数据结构-队列(循环队列)
前情回顾 在上一篇,笔者给大家介绍了数组队列,并且在文末提出了数组队列实现上的劣势,以及带来的性能问题(因为数组队列,在出队的时候,我们往往要将数组中的元素往前挪动一个位置,这个动作的时间复杂度O(n ...
- 第七周--数据结构--队列数组
/* *第七周--数据结构--队列数组 *Copyright (c) 2015 烟台大学计算机与控制工程学院 *All right reserved. *文件名称:li ...
- 数据结构-队列和栈有什么区别
数据结构-队列和栈有什么区别 1:队列和栈是两种不同的数据结构.它们有以下区别: (1)操作的名称不同.队列的插入称为入队,队列的删除称为出队.栈的插入称为进栈,栈的删除称为出栈. (2)可操作的方式 ...
- 数据结构——队列的C语言代码实现
系列文章目录 数据结构--顺序表的C语言代码实现 数据结构--八种链表的C语言代码实现 数据结构--栈的C语言代码实现 数据结构--队列的C语言代码实现 数据结构--堆的C语言代码实现 文章目录 系列 ...
- 数据结构——队列 c++详解
1.队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点: (1)队列中的数据元素遵循"先进先出"(First In First Out)的原则,简称FIFO结构: (2 ...
- C++数据结构——队列
C++数据结构--队列 参考博客: 数据结构图文解析之:队列详解与C++模板实现 C++ stl队列 ...
最新文章
- 中序非递归遍历二叉树
- 不自动切换eclipse视图
- PHP生成器--动态生成内容的数组
- 在Windows下删除Linux系统的方法
- Unknown entity (Hibernate的findById方法参数必须加上包名)
- 搭建Cocos2d-js开发环境(Window)
- OpenCV-图像处理(09、模糊图像二)
- 文档数据库和关系数据库的区别
- P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
- java method方法_java入门(六) | 方法(Method)的定义和使用
- 计算机函数求奖学金,Excel函数在高校奖学金评定中的实践应用参考.pdf
- html 小游戏 俄罗斯方块
- C语言实现扫描文件下所有目录
- 手持gps坐标设置_学术 | 许其凤院士:GPS移动定位与移动网络定位精度的分析
- 详谈C++11新特性之future及开源项目ananas(folly,std c++11和ananas的future各自的区别是?)
- Oracle介绍及视频教程
- 后台管理系统色系搭配推荐
- 转载CS231n课程学习笔记
- svn e170001 authorization failed 的解决
- CF346B Lucky Common Subsequence 题解