STL之queue

目录

queue队列

常用的deque函数

priority_queue队列(非常重要)

priority_queue常用函数

优先队列修改比较函数的方法

1.仿函数方法

2.自定义比较函数

deque双端队列

常用的函数

例题1

题目描述

输入描述

输出描述

示例输入输出

例题2

题目描述

输入描述

输出描述

输入输出示例

输入

输出


queue队列

queue是一种先进先出(FIFO)的数据结构。

queue提供了一组函数来操作和访问元素,但它的功能相对较简单。

queue的定义和结构如下:

template>
class queue;

T:表示存储在queue中的元素类型。

Container:表示底层容器的类型,默认为queue。也可以使用其他容器类型,如list。

queue内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素。

常用的deque函数

函数                        描述                        时间复杂度

push(x)            在队尾插入元素x                 O(1)

pop()                弹出队尾元素                      O(1)

front()              返回队首元素                       O(1)

back()              返回队尾元素                       O(1)

empty()            检查队列是否为空                O(1)

size()               返回队列中元素的个数         O(1)

priority_queue队列(非常重要)

priority_queue与普通队列不同,priority_queue中的元素是按照一定的优先级进行排序的。默认情况下,priority_queue按照元素的值从大到小进行排序,即最大元素位于队列的前面。

priority_queue的定义和结构如下:

template>,
         class Compare = less>
class priority_queue;

T:表示存储在priority_queue中的元素类型。

Container:表示底层容器的类型,默认为vector。也可以使用其他容器类型,如deque。

Compare:表示元素之间的比较函数对象的类型,默认为less,即按照元素的值进行比较。

priority_queue的内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素。

priority_queue常用函数

函数                        描述                                时间复杂度

push(x)            在队尾插入到优先队列中          O(logn)

pop()                弹出优先队列中的顶部元素      O(logn)

top()                返回优先队列中的顶部元素       O(1)

empty()            检查优先队列是否为空             O(1)

size()               返回优先队列中元素的个数       O(1)

优先队列是个十分重要的数据结构

优先队列修改比较函数的方法

1.仿函数方法

struct Compare
{
    bool operator()(int a,int b)
    {
        //自定义的比较函数,按照逆序排列
        return a>b;
    }
};
int main()
{
    std::priority_queue,Compare>pq;
}

2.自定义比较函数

auto compare = [](int a,int b)
{
    return a>b;
};
std::priority_queue,decltype(compare)>pq(compare);

deque双端队列

deque(双端队列)是一种容器,它允许在两端进行高效的插入和删除操作。deque是由一系列连续的存储块(缓冲区)组成的,每个存储块都存储了多个元素。这使得deque能够在两端进行快速的插入和删除操作,而不需要移动其他元素。

常用的函数

函数                                描述                                时间复杂度

push_back(x)            在尾部插入元素x                 平摊O(1)

push_front(x)             在头部插入元素x                 平摊O(1)

pop_front()                 弹出头部元素                       O(1)

pop_back()                 弹出尾部元素                       O(1)

front()                         返回头部元素                       O(1)

back()                         返回尾部元素                       O(1)

empty()            检查deque是否为空                        O(1)

size()               返回deque中元素的个数                 O(1)

clear()            清空deque中的所有元素                   O(1)

例题1

题目描述

ZZB银行有两个窗口,VIP窗口和普通窗口,VIP用户进入VIP窗口排队,剩下的进入普通窗口排队。现有M次操作,操作有四种类型如下:

IN name v:表示一名叫name的用户到VIP窗口排队

OUT v:表示VIP窗口队头的用户离开排队

IN name N:表明一名叫name的用户到普通窗口排队

OUT N:表明普通窗口队头的用户离开排队

求M次操作后VIP窗口队列和普通队列中的姓名

输入描述

第一行是一个整数M(1<=M<=1000),表示一共有M次操作,

第二行到第M+1行输入操作格式如下:

IN name v

OUT v

IN name N

OUT N

输出描述

输出M次操作后VIP窗口队列和普通队列中的姓名(从头到尾),先输出VIP窗口队列后输出普通窗口队列。

示例输入输出

输入:

5
IN xiaoming N
IN adel V
IN LAOZHAO N
OUT N
IN CLZ V

输出:

adel
CLZ
LAOZHAO

#include
#include
#include
using namespace std;


int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int m; cin >> m;
	queueV, N;
	while (m--)
	{
		string op; cin >> op;
		if (op == "IN")
		{
			string name,q; cin >> name>>q;
			if (q == "V")
			{
				V.push(name);
			}
			else
			{
				N.push(name);
			}
		}
		else
		{
			string q; cin >> q;
			if (q == "V")
			{
				V.pop();
			}
			else
			{
				N.pop();
			}
		}
	}
	while (V.size())
	{
		cout << V.front() << endl;
		V.pop();
	}

	while (N.size())
	{
		cout << N.front() << endl;
		N.pop();
	}

	return 0;
}

例题2

题目描述

在一个果园里,多多已经将所有的果子打下来了,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

每一次合并,多多可以把两堆果子合到一起,消耗的体力等于两堆果子重量之和。可以看出,所有的果子经过n-1次合并之后,就剩下一堆了,多多在合并果子是总共消耗的体力等于每次合并消耗体力之和。

设计合并次序方案,获取体力消耗最小值。

输入描述

输入两行

第一行是一个整数n(1<=n<=10^4),表示果子的种类数。

第二行包含n个整数,表示每种果子的数量。

输出描述

输出一个整数,体力最小值,输入数据保证这个值小于2^33.

输入输出示例

输入

3

1 2 9

输出

15

#include
#include
#include
#include
using namespace std;
using LL = long long;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n; cin >> n;
	priority_queue,greater> pq;
	for (int i = 1; i <= n; i++)
	{
		LL x; cin >> x;
		pq.push(x);
	}
	LL ans = 0;
	while (pq.size() >= 2)
	{
		LL x = pq.top(); pq.pop();
		LL y = pq.top(); pq.pop();

		ans += x + y;
		pq.push(x + y);
	}
	cout << ans << endl;

	return 0;
}

你可能感兴趣的:(c++,开发语言)