【STL_ queue】队列|优先队列|详解,包括常用函数,基本使用

一,队列

队列这种数据结构在我们手写队列一文中已经提到过了,队列是一种简单的数据结构,首先我们可以知道队列是一种有出 ,入 ,两种操作,并且我们存储相关的关系的时候,我们还要进行相关的数据结构的存储,所以我们要开一个数组单位来存储这个队列的单位元素。然后为了完成这个基本的出入操作,我们可以把这个数据结构改造成一个双指针的数据结构,我们在头结点和尾结点分别设置一个指针,来完成这个数据结构。


想更加深入了解可以观看手写队列一节
在这里插入图片描述

二,队列的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 ;
}

猜你喜欢

转载自blog.csdn.net/wen030803/article/details/131977285
今日推荐