一,队列
队列这种数据结构在我们手写队列一文中已经提到过了,队列是一种简单的数据结构,首先我们可以知道队列是一种有出 ,入 ,两种操作,并且我们存储相关的关系的时候,我们还要进行相关的数据结构的存储,所以我们要开一个数组单位来存储这个队列的单位元素。然后为了完成这个基本的出入操作,我们可以把这个数据结构改造成一个双指针的数据结构,我们在头结点和尾结点分别设置一个指针,来完成这个数据结构。
想更加深入了解可以观看手写队列一节
二,队列的stl的实现
1,队列的创建
queue <type> name ;
2, 队列的常见的弹出,压入,队头队尾
压入push
#include <iostream>
#include <queue>
using namespace std ;
int main ()
{
queue <int> q ;
q.push (100 ) ;
cout << q.front() << endl ;
return 0 ;
}
弹出
q.pop() ;
返回队头队尾
q.front()
//队头
q.back() ;
//队尾
3, 常用操作
队列的大小
q.size() ;
三,优先队列
1,优先队列
优先队列首先是一种堆的数据结构改变过来实现的一种数据结构,本质上来说,优先队列是一种有权值观念的数据结构,首先我们可以自己写权值,来完成对队列内的排序。整个权值的书写是需要专门的库的实现 functional priority_queue < type> ,优先队列中是按照整个权值关系输出的,默认输出最大堆。
这个优先级的表现是先输出优先级最高的,从高到低输出
2,优先队列的创建
priority_queue <type , 容器 , 权值> name
- 创建一个默认的优先队列(数值大的先出队)
priority_queue <type > name ;
- 快速创建一个反默认的优先队列(数值小的先出队)
priority_queue <int , vector<int> ,greater<int> >
- 创建自定义的序列
我们在定义序列中,返回的真假关系应该和我们所表达的是相反的,比如A<B ,真假判断的时候 我们应该给他false
实际上这是因为在数组上优先级比较大的是后面的元素 也就是 b
创建方式 :functional 方式
struct 结构构建
functional
#include <iostream>
#include <queue>
#include <functional>
using namespace std ;
bool cmp(int a ,int b )
{
return a > b ;
}
int main ()
{
priority_queue <int , vector<int> ,function<bool(int ,int)>> qu(cmp) ;
qu.push (34);
qu.push (345);
qu.push(354);
while ( qu.size() )
{
cout << qu.top() << endl ;
qu.pop() ;
}
return 0 ;
}
struct 构建
复杂不再展示
3,优先队列的基础操作
添加函数,删除函数
//压入队头
q.push() ;
//弹出队尾
q.pop() ;
弹出队头
q.top() ;
4,基础函数
返回优先队列的大小
cout << q.size() << endl ;
** 简单的实现的过程**
#include <iostream>
#include <queue>
#include <functional>
#include <vector>
using namespace std ;
bool cmp(pair<int, int > a, pair<int, int > b)
{
if( a.first != b.first)
return a.first < b.first ;
return a.second > b.second ;
}
int main ()
{
int n ;
int j = 1 ;
cin >> n ;
//输出最大的元素 ,当有多个的时候输出下标最小的
priority_queue <pair<int,int> ,vector<pair<int,int> > ,function<bool(pair<int,int> ,pair<int,int>)> >q(cmp);
for(j = 1 ; j <= n ; j ++ )
{
int x ;
cin >> x ;
q.push({x , j});
}
for(int i = 1 ; i <= n ; i ++ )
{
auto t = q.top() ;
cout << t.second << endl ;
q.pop() ;
}
return 0 ;
}