STL 中的队列使用

本文详细介绍了STL中的队列(queue)、双端队列(dequeue)及优先队列(priority_queue)的使用方法,包括基本操作、特殊功能及实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、队列(queue)

众所周知,队列是一个神奇的数据结构(具体神奇在哪里,请自行体会),但手写的队列,你需要维护一个head和tail,还要战战兢兢地时刻注意这个head有没有被tail追到,但是——————————————
———————————————————————— 在有了STL库后,就省事多了。
声明:
需用头文件#include < queue >,然后
queue < int > q ;

基本操作(如代码所示)

#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
int main()
{
    int e,n,m;
    queue<int> q1;
    for(int i=0;i<10;i++)
       q1.push(i); //入队
    if(!q1.empty()) //是否为空
    cout<<"dui lie  bu kongn";
    n=q1.size();//队列长度
    cout<<n<<endl;
    m=q1.back(); //队尾元素
    cout<<m<<endl;
    for(int j=0;j<n;j++)
    {
       e=q1.front();//队首元素
       cout<<e<<" ";
       q1.pop();//弹出队首
    }
    cout<<endl;
    if(q1.empty())
    cout<<"dui lie  bu kongn";
    system("PAUSE");
    return 0;
}

需要注意的是,STL中的queue维护的是一个循环队列。

二、dequeue

这个更加神奇,不仅能在首尾操作,还可以操作中间元素。
别的不说,上代码:

#include<iostream>
#include<deque>
using namespace std;

//用下标遍历队列
void showdeque1(deque<int>& d) {
	for (int i = 0; i < d.size(); i++) cout << d[i] << " ";
	cout << endl;
}
//用迭代器迭代队列
void showdeque2(deque<int>& d) {
	for (deque<int>::iterator it = d.begin(); it != d.end(); it++) cout << *it << " ";
	cout << endl;
}
int main()
{
	deque<int> d; //初始化一个双端队列
				  //从尾部插入元素[1,2,3,4,5],会不断扩张队列
	for (int i = 1; i <= 5; i++) d.push_back(i);
	//遍历双端队列
	cout << "初始队列:";
	showdeque1(d);

	//从头部插入元素,会将另一头的元素出队
	d.push_front(6);
	d.push_front(7);

	//用迭代器迭代队列
	cout << "在头部插入6,7后的队列:";
	showdeque2(d);

	//在双端队列的头部删除元素
	d.pop_front();
	cout << "删除一个头部元素后:";
	showdeque1(d);

	//在双端队列的尾部删除元素
	d.pop_back();
	cout << "删除一个尾部元素后:";
	showdeque1(d);

	//从中间插入元素
	d.insert(d.begin() + 1, 100);
	cout << "在开头的第二个位置插入元素100:";
	showdeque1(d);

	//删除中间元素
	d.erase(d.end() - 2);
	cout << "删除倒数第二个元素:";
	showdeque1(d);

	cout << "size = " << d.size() << endl;
	//重新指定大小,容量增加默认值为0
	d.resize(6);
	cout << "扩容到size = 6 :";
	showdeque1(d);
	cout << "减少容量到size = 2:";
	d.resize(2); showdeque1(d);
	d.clear();
	cout << "清除容器后empty?" << d.empty() << endl;
	return 0;
}

前面的两个函数都是用来遍历队列的,扩容等操作的使用就自行探究了。

三、优先队列

优先队列是一种特殊的队列,用堆来维护的队列。
那么优先队列是什么呢?
说白了,就是一种功能强大的队列。
它的功能强大在哪里呢?
四个字:自动排序。

一个优先队列声明的基本格式是:
priority_queue<结构类型> 队列名;

基本操作与queue是一致的,不过q.top()值是队列中最大或最小的一个(取决于维护的堆)
STL中默认的是大根堆
声明方式:
priority_queue <int,vector,less > p;~~~~~~~~~~~~~~~~~~ 大根堆
priority_queue <int,vector,greater > q;~~~~~~~~~~~~~~~~小根堆

这玩意更强大的一点就在于,它可以排序结构体

#include<cstdio>
#include<queue>
using namespace std;
struct node
{
    int x,y;
    bool operator < (const node & a) const //重载运算符
    {
        return x<a.x;
    } //x小的在堆中就小
}k;
priority_queue <node> q;
int main()
{
    k.x=10,k.y=100; q.push(k);
    k.x=12,k.y=60; q.push(k);
    k.x=14,k.y=40; q.push(k);
    k.x=6,k.y=80; q.push(k);
    k.x=8,k.y=20; q.push(k);
    while(!q.empty())
    {
        node m=q.top(); q.pop();
        printf("(%d,%d) ",m.x,m.y);
    }
}

其余操作:

#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int,vector<int>,less<int> > p; //大根堆 
priority_queue <int,vector<int>,greater<int> > q; //小根堆 
int a[5]={10,12,14,6,8};
int main()
{
    for(int i=0;i<5;i++)
        p.push(a[i]),q.push(a[i]);

    printf("less<int>:");
    while(!p.empty())
        printf("%d ",p.top()),p.pop();  

    printf("\ngreater<int>:");
    while(!q.empty())
        printf("%d ",q.top()),q.pop();
        
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值