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

文章详细介绍了C++中队列的基本概念和实现,包括使用STL的queue进行队列操作,如压入、弹出和获取队头、队尾元素。同时,文章还讲解了优先队列的概念,它是基于堆实现的有优先级的数据结构,可以按优先级顺序输出元素。文章提供了优先队列的创建和基础操作示例,包括自定义比较函数的情况。
摘要由CSDN通过智能技术生成

一,队列

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


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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值