适配器Stack、queue、priority_queue

适配器

在STL中提供了三个常用容器适配器:stack,queue队列,priority_queue优先级队列
适配器都是包装了vector,list,deque中某个顺序容器包装器,也可以看作由其他容器实现的容器
适配器没有提供迭代器,也不能同时插入或删除多个元素。

Stack

stack适配器的默认的参数中容器使用deque实现的,可选择的容器有list,vector,deque,实现后进先出的值的排列(栈结构)

主要操作

  1. push(x) 压入
  2. pop() 弹出
  3. top() 获取栈顶元素(不弹出)
  4. empty()
  5. size()

代码

#include<iostream>
#include<stack>
using namespace std;
int main() {
	stack<int> s;//default::deque默认为deque为底层容器
	//入栈
	s.push(1);
	s.push(7);
	s.push(2);
	s.push(5);
	//出栈
	while (!s.empty()) {
		//栈顶元素
		cout << s.top() << " ";
		s.pop();
	}
	cout << endl;
}

在这里插入图片描述
自定义底层容器

stack<int, vector<int>> s;

注意

  1. 取栈顶元素不会删除栈顶元素;pop()无返回值 ,负责出栈
  2. stack s;//default::deque默认为deque为底层容器
  3. 头文件#include<stack>

queue

queue默认底层容器为deque,也可以为list,不能为vector(因为vector不能对头部元素进行操作,而queue是尾部进队,头部出队),先进先出(队列结构)

主要操作

  1. push(x) 压入
  2. pop() 弹出
  3. front() 获取首元素(不弹出)
  4. back()
  5. empty()
  6. size()

代码

#include<iostream>
#include<queue>
using namespace std;
int main() {
	queue<int> q;
	q.push(1);
	q.push(7);
	q.push(2);
	q.push(3);
	q.push(8);
	q.push(11);
	q.push(100);
	while (!q.empty()) {
		cout << q.front() << " ";
		q.pop();
	}
}

在这里插入图片描述
修改底层数据结构

#include<list>
queue<int, list<int>> q;

priority_queue

priority_queue也是一个队列,其元素按有序顺序排列,但不采用严格的先进先出的顺序,而是按照优先级,给定时刻位于对头的元素正式有最高优先级的元素。如果两个元素具有相同优先级,那么它们在队列中就遵循先进先出的语义,它默认适配的底层容器为vector,也可以使用deque,但不能用list,因为priority_queue要求能对元素随机访问以便进行排序,list底层为链表,不能随机访问。

主要操作

代码

#include<iostream>
#include<queue>
#include<functional>
using namespace std;
int main() {
	priority_queue<int, vector<int>, less<int>> pq;//大的元素优先级高
	pq.push(101);
	pq.push(2);
	pq.push(35);
	pq.push(28);
	pq.push(7);
	pq.push(3);
	while(!pq.empty()) {
		cout << pq.top() << " ";
		pq.pop();
	}
}

在这里插入图片描述
使用deque为底层:

priority_queue<int, deque<int>, greater<int>> pq;

在这里插入图片描述

注意

  1. 头文件#include<queue>,定义priority_queue<数据类型,底层数据结构,排序方法>
  2. less 表示大的优先级高,大的先出队,从大到小
  3. greater表示小的优先级高,小的先出队,从小到大
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值