首页 > 编程语言 >【C++】队列

【C++】队列

时间:2024-09-25 19:48:08浏览次数:3  
标签:队列 元素 pop queue que C++ push

示意图

什么是队列

队列(queue)是一种具有 先进入队列的元素一定先出队列 性质的表。由于该性质,队列通常也被称为先进先出(first in first out)表,简称 FIFO 表。就像排队一样,最先到的人也就最先买到单,优先离开队伍


头文件与声明

头文件

#include <queue>

声明定义
queue<G> que;
//G —— 数据类型
用数组模拟栈
定义
int q[SIZE], ql = 1, qr;
//SIZE:长度
//ql:队尾
//qr:队头
插入

q[++qr] = x;

删除

ql++;

访问队首

q[ql]

访问队尾

q[qr]

清空

ql = 1, qr = 0;

长度

qr - ql + 1

为空

ql == qr + 1

其实双栈也可以实现1


STL queue 常用函数

V 为要操作的元素

  • 元素访问
    • que.front() 访问队首元素
    • que.back() 访问队尾元素
  • 修改
    • que.push(V) 在队尾插入元素 V V V
    • que.pop() 弹出队首元素
  • 测量
    • que.empty() 判断容器是否为空(空返回1,有返回0)
    • que.size() 查询容器的长度(元素数量)
  • 运算符
    • queue重载了 ” = = =“ 运算符,q1 = q2; 将队列 q 1 q1 q1 的所有元素赋给 q 2 q2 q2

特殊队列

双端队列

定义

双端队列是指一个可以在队首和队尾执行普通队列操作的队列。

头文件
#include <deque>
声明
deque<G> deq;
//G —— 数据类型
STL deque 常用函数

V 为要操作的元素

  • 元素访问
    • que.front() 访问队首元素
    • que.back() 访问队尾元素
  • 修改
    • que.push_back(V) 在队尾插入元素 V V V
    • que.pop_back() 弹出队首元素
    • que.push_front(V) 在队首插入元素 V V V
    • que.pop_front() 弹出队首元素
  • 测量
    • que.empty() 判断容器是否为空(空返回1,有返回0)
    • que.size() 查询容器的长度(元素数量)
  • 运算符
    • deque也同 queue 一样重载了 ” = = =“ 运算符
    • 重载 [],可以像数组访问元素

优先队列

<queue> 中还提供了优先队列

G —— 数据类型

  1. 大根堆
priority_queue<G, vector<G>, less<G> > pq;//完整版
priority_queue<G> pq;//化简版
  1. 小根堆
priority_queue<G, vector<G>, greater<G> > pq;//完整版

循环队列

一种优化方式,对于用数组模拟的栈有效。

随着时间的推移,栈序列将达到数组尾部,而前端却是空的,此时在进行插入则会导致溢出,称为〔假溢出〕。

这时就需要采取循环的方法,类似循环链表,数组最后一位的下一个直接连着第一位,提高利用率,这就有了循环队列。


例题

洛谷B3616
考察对队列的理解。
操作在题目中十分明显,按照题意模拟即可

#include<bits/stdc++.h>
using namespace std;

int n, m, op, x;
queue<int> q;

int main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> op;
        if(op == 1){
        	cin >> x;
        	q.push(x);//插入
        }
        else if(op == 2){
            if(q.empty()){
            	cout << "ERR_CANNOT_POP\n";//要判断是否为空,否则RE
            }
            else{
            	q.pop();//如果不为空,弹出
            }
        }
        else if(op == 3){
            if(q.empty()){
            	cout << "ERR_CANNOT_QUERY\n";//判空
            }
            else{
            	cout << q.front() << endl;//输出第一个
            }
        }
        else{
        	cout << q.size() << endl;//输出队列大小
        }
    }
    return 0;
}

洛谷P1090

使用小根优先队列,每此将最小的两个数合并后重新入队,同时统计耗费

代码

#include<bits/stdc++.h>
using namespace std;

priority_queue <int, vector<int>, greater<int> > q;
int n, sum, c, d;

int main(){
	cin >> n;
	for(int i = 1, x; i <= n; i++){
		cin >> x;
		q.push(x);
	}
	while(q.size() > 1){
		c = q.top();
		q.pop();
		d = q.top();
		q.pop();
		q.push(c + d);
		sum += c + d;
	}
	cout << sum;
  return 0;
}

End \Huge\color{Grey}\text{End} End

push:插入到栈 F 中。
pop:如果 S 非空,让 S 弹栈;否则把 F 的元素倒过来压到 S 中(其实就是一个一个弹出插入,做完后是首尾颠倒的),然后再让 S 弹栈。
容易证明,每个元素只会进入/转移/弹出一次,均摊复杂度 O(1)。来源:oi-wiki


  1. 这种方法使用两个栈 F, S 模拟一个队列,其中 F 是队尾的栈,S 代表队首的栈,支持 push(在队尾插入),pop(在队首弹出)操作: ↩︎

标签:队列,元素,pop,queue,que,C++,push
From: https://blog.csdn.net/qiutian120529/article/details/142466027

相关文章

  • 【C++】面向对象编程的三大特性:深入解析继承机制
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority......
  • 【线程】POSIX信号量---基于环形队列的生产消费者模型
    信号量概念这篇文章是以前写的,里面讲了 SystemV的信号量的概念,POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。但POSIX可以用于线程间同步。信号量的概念POSIX信号量的接口初始化信号量参数:pshared:0表示线程间共享,非0表示进程......
  • c++ 静态私有成员
    1.概要1.问题提出价值:关于静态和私有的问题,静态的且是私有的,有什么价值呢,就是只有在类的函数中可以使用和赋值,这有一个隔离的价值。矛盾:静态成员必须在类的外部初始化,初始化那就要赋值,赋值就要访问,这和上面视乎矛盾?2.调查结果结论:静态私有成员可以在类的外部初始化;3.相关......
  • C++开发项目
    1.项目系统需求文章目录1.项目系统需求功能如下:2.创建项目:3.创建管理类3.1创建文件3.2头文件实现3.3源文件实现4.菜单功能4.1添加成员函数4.2菜单功能实现4.3测试菜单功能5.退出功能5.1提供功能接口5.2实现退出功能5.3测试功能运行效果图:6.创建职工类6.1创建职工抽象类6.2创建普......
  • 【每周例题】蓝桥杯 C++ 数树数
    数树数题目数树数题目分析通过图片的二叉树,我们可以发现每一个·分支的L=2a-1R=2a代码#include<iostream>#include<string>usingnamespacestd;chars[50];inta;intmain(){intn,q;cin>>n>>q;for(inti=0;i<q;i++){......
  • 【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
    文章目录C++`vector`容器详解:从入门到精通前言第一章:C++`vector`容器简介1.1C++STL容器概述1.2为什么使用`vector`1.3`vector`的优缺点第二章:`vector`的构造方法2.1常见构造函数2.1.1示例:不同构造方法2.1.2相关文档第三章:`vector`容量与大小操作3.1......
  • 广州C++信奥赛老师解一本通题 1389:亲戚
    ​ 【题目描述】若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的某个人所在家族的人数。规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。【输入】第一行:三个整数n,(n......
  • C++考试题-9道编程题运算符重载带部分答案
    【1】写出下列程序的运行结果。#include<iostream>   usingnamespacestd;classA{public:   A(inti):x(i)   { }   A(){x=0;}   friendAoperator++(Aa);   friendAoperator--(A&a);   voidprint();private:   i......
  • C++考试题带部分答案函数模板
    【1】写出下面程序的运行结果。#include<iostream>   usingnamespacestd;template<classType1,classType2>classmyclass{public:myclass(Type1a,Type2b){i=a;j=b;}voidshow(){cout<<i<<′′<<j<<′\n′;}private:Type1i;T......
  • 【JUC并发编程系列】深入理解Java并发机制:阻塞队列详解与简单纯手写(七、BlockingQueu
    文章目录【JUC并发编程系列】深入理解Java并发机制:阻塞队列详解与简单纯手写(七、BlockingQueue、ArrayBlockingQueue、LinkedBlocking)1.简单回顾1.1数组结构和链表结构1.1.1数组结构1.1.2链表结构1.2有界队列与无界队列1.3Lock锁使用回顾2.什么是阻塞队列3.B......