STL栈、队列、优先队列—————基础知识

0基本特点:后进先出(LIFO)

注意:

不一定最先进栈的最后出栈,只要保证是栈顶元素出栈就行!

当栈中存在一个元素时,top=0,因此通常把空栈的判定条件定为top= - 1;

STL 中栈的使用方法:

头文件:#include <stack>

基本操作:

push(x) 将x加入栈中,即入栈操作

pop() 出栈操作(删除栈顶),只是出栈,没有返回值

top() 返回第一个元素(栈顶元素)

size() 返回栈中的元素个数

empty() 当栈为空时,返回 true

STL 中队列的使用(queue)

#include <queue>

基本操作:

push(x) 将x压入队列的末端

pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值

front() 返回第一个元素(队顶元素)

back() 返回最后被压入的元素(队尾元素)

empty() 当队列为空时,返回true

size() 返回队列的长度

STL 中优先队列的使用详细介绍(priority_queu)

头文件: #include <queue>

基本操作:

empty() 如果队列为空返回真

pop() 删除对列首元素

push() 加入一个元素

size() 返回优先队列中拥有的元素个数

top() 返回优先队列首元素

优先队列的两种生声明方式:

std::priority_queue<T> pq;
std::priority_queue<T, std::vector<T>, cmp> pq;

在默认的优先队列中,优先级高的先出队。

标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系。

(1)优先队列的第一种用法,这是最常用的默认的优先级用法,也就是优先级高的先出队列,例如说一个int优先队列,那么出队的时候就是int大的先出队列。

下面给出一个例子:

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main()
  5. {
  6. priority_queue<int> q;
  7. for(int i = 1;i <= 5;i++)
  8. {
  9. q.push(i);
  10. }
  11. for(int i = 0;i < 5;i++)
  12. {
  13. cout<<q.top()<<endl;
  14. q.pop();
  15. }
  16. return 0;
  17. }

(2)那么如果想要优先队列中低优先级的元素先出队列,怎么办呢? --- 自定义优先级

①方法一:我们可以传入一个比较函数,使用functional头文件中的greater函数对象作为比较函数

注意:首先要添加头文件:#include <functional>

priority_queue< int,vector<int>,greater<int> > q; // 注意:> > 误写成>> 会报错

这样我们就创建了一个低优先级元素先出对列的优先队列。

修改上面的例子,运行,就会发现,输出的顺序变成了:1 2 3 4 5。

当然,与greater相对的less,如果传入less这个比较函数,那么就是高优先级元素先出队列了。

priority_queue< int,vector<int>,less<int> > q;

priority_queue<int> q;

以上创建的优先队列是相同的。

②方法二:自己实现比较函数

  1. struct cmp1
  2. {
  3. bool operator ()(int x,int y)
  4. {
  5. return x>y; //小值优先
  6. }
  7. };

priority_queue<int,vector<int>,cmp1 > q;这样就创建了一个小值元素先出队列的优先队列,这里的 cmp1 作用就相当于 greater

同理我们可以写出:

  1. struct cmp2
  2. {
  3. bool operator ()(int x,int y)
  4. {
  5. return x<y; //大值优先
  6. }
  7. };

(3)假如优先队列中的元素是一个结构对象或者是类对象,那么如何重新自定义其优先级比较呢?

例子一:定义一个结构体,这个结构体只有一个元素 x 。

①低优先级元素先出队列,也就是x值小的先出队列。

  1. struct number1
  2. {
  3. int x;
  4. bool operator < (const number1 &a) const
  5. {
  6. return x>a.x;//小值优先
  7. }
  8. };
struct number1
{
    int x;
    bool operator < (const number1 &a) const
    {
        return x>a.x;//小值优先
    }
};
  1. number1 num1[5];
  2. priority_queue<number1>q;
  3. for(int i = 1; i <= 5; i++)
  4. {
  5. num1[i].x = i;
  6. q.push(num1[i]);
  7. }
  8. for(int i = 1; i <= 5; i++)
  9. {
  10. cout<<q.top().x<<endl;
  11. q.pop();
  12. }
number1 num1[5];
    priority_queue<number1>q;
    for(int i = 1; i <= 5; i++)
    {
        num1[i].x = i;
        q.push(num1[i]);
    }
    for(int i = 1; i <= 5; i++)
    {
        cout<<q.top().x<<endl;
        q.pop();
    }

输出: 1 2 3 4 5

②高优先级元素先出队列,也就是x值大的先出队列。

  1. struct number2
  2. {
  3. int x;
  4. bool operator < (const number2 &a) const
  5. {
  6. return x<a.x;//大值优先
  7. }
  8. };
struct number2
{
    int x;
    bool operator < (const number2 &a) const
    {
        return x<a.x;//大值优先
    }
};

注意到:结构体中重载的运算符只可以是 <, 因为标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系,如果重载 > ,那么会编译错误。

例子二:在上面的例子中,我们是将 结构体中的 x 的大小当做是优先级比较值了。下面给出另一例子,这个例子更具有一般性。

  1. struct node
  2. {
  3. friend bool operator < (node n1, node n2)
  4. {
  5. return n1.priority < n2.priority;
  6. }
  7. int priority;
  8. int value;
  9. };
struct node
{
    friend bool operator < (node n1, node n2)
    {
        return n1.priority < n2.priority;
    }
    int priority;
    int value;
};

在这个结构体中,priority表征优先级值。

[cpp] view plain copy

print?

  1. priority_queue<node> qn;
  2. node b[5];
  3. b[0].priority = 6; b[0].value = 1;
  4. b[1].priority = 9; b[1].value = 5;
  5. b[2].priority = 2; b[2].value = 3;
  6. b[3].priority = 8; b[3].value = 2;
  7. b[4].priority = 1; b[4].value = 4;
  8. for(int i = 0; i < 5; i++)
  9. qn.push(b[i]);
  10. cout<<"优先级"<<‘\t‘<<"值"<<endl;
  11. for(int i = 0; i < 5; i++)
  12. {
  13. cout<<qn.top().priority<<‘\t‘<<qn.top().value<<endl;
  14. qn.pop();
  15. }
priority_queue<node> qn;
    node b[5];
    b[0].priority = 6; b[0].value = 1;
    b[1].priority = 9; b[1].value = 5;
    b[2].priority = 2; b[2].value = 3;
    b[3].priority = 8; b[3].value = 2;
    b[4].priority = 1; b[4].value = 4;

    for(int i = 0; i < 5; i++)
        qn.push(b[i]);
    cout<<"优先级"<<‘\t‘<<"值"<<endl;
    for(int i = 0; i < 5; i++)
    {
        cout<<qn.top().priority<<‘\t‘<<qn.top().value<<endl;
        qn.pop();
    }

输出结果为:
优先级  值
9          5
8          2
6          1
2          3
1          4

时间: 2024-10-23 17:22:23

STL栈、队列、优先队列—————基础知识的相关文章

【STL】栈+队列+优先队列(详)+ 拯救行动题解

一.栈 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素. 说通俗一点,就是一种有口无肛门的数据结构 咳咳...是一种满足"后进先出"规则的数据结构.有PUSH和POP两种操作.PUSH:把元素压入栈顶 POP:把元

[noip模拟]画展&lt;队列的基础知识&gt;

Description 博览馆正在展出由世上最佳的M位画家所画的图画.人们想到博览馆去看这几位大师的作品.可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字,a和b,代表要看展览中的第a幅至第b幅画(包含a和b)之间的所有图画,而门票的价钱就是一张图画一元.人们希望入场后可以看到所有名师的图画(至少各一张).可是又想节省金钱……请你写一个程序决定购买门票时的a值和b值. Input 第一行是N和M,分别代表博览馆内的图画总数及这些图画是由多少位名师的画所绘画的.其后的一行包含

消息队列RabbitMQ基础知识详解

一: 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序或者模块对模块的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息. 常见的消息队列有RabbitMQ和kafka.下面详细介绍一下RabbitMQ的适用场景和基本概念. 二: 适用场景 2.1 并发处理 (1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端. 这有一个问题是,邮件,短

OpenStack消息队列AMQP基础知识

AMQP模型 AMQP中有几个重要的概念 Producer: 消息发送者. 负责创建消息, 填充消息内容(比如 routing key), 并发送消息到 Exchange Exchange: 从Producer接受消息, 根据Bindings中的配置, 把消息分派到对应的Queue中 Bindings:  描述了Exchange和Queue之间的关系. Exchange 根据消息内容 (routing key), 和Binding配置来决定把消息分派到哪个Queue中 Queue: 存储消息,

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

C++STL泛型编程基础知识讲解--------2015年2月3日

今天学习了C++STL泛型编程的基础知识,我对主要知识整理如下: STL提供三种类型的组件:容器,迭代器,算法.支持泛型程序设计标准.容器主要有两类:顺序容器和关联容器.顺序容器:vector,list,deque,string等都是一系列连续元素的集合.关联容器:set,multiset,map,multimap包含查找元素的键值.迭代器:遍历容器STL算法库:排序算法,不可变序算法,变序性算法,数值算法. /******************************************

STL的队列和栈简单使用

STL的队列和栈简单使用 #include <iostream>#include <cstdio>#include <string.h>#include <algorithm>#include <queue>#include <stack>using namespace std;int main(){ queue<int> Q; stack<int> S; int i; for(i=1;i<=10;i++

Python全栈开发之17、tornado和web基础知识

一.web基础知识 学习web框架之前,先来看一下web基础知识,首先要明白其本质就是socket,用户对应一个socket客户端,但是如果从socket开始开发web应用程序那么效率太了,正确的做法是底层socket处理代码由专门的服务器软件实现,而对于真实开发中的python web程序来说也是一般会分为两部分:服务器程序和应用程序.服务器程序负责对socket服务器进行封装,并在请求到来时,先经过web服务器,对请求的各种数据进行整理封装.之后web服务器将封装好的数据传递给应用程序,应用

RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息队列主要解决了应用耦合.异步处理.流量削锋等问题. 当前使用较多的消息队列有RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaMq等,而部分数据库如Re