stack,queue, priority_queue

2024-09-07 19:18
文章标签 stack queue priority

本文主要是介绍stack,queue, priority_queue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STL 中栈的使用方法(stack)

#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() 返回优先队列首元素

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

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


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

下面给出一个例子:

[cpp] view plain copy print ?
  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. }  
#include <iostream>
#include <queue>
using namespace std;
int main()
{
priority_queue<int> q;
for(int i = 1;i <= 5;i++)
{
q.push(i);
}
for(int i = 0;i < 5;i++)
{
cout<<q.top()<<endl;
q.pop();
}
return 0;
}
运行结果可想而知,就是从大到小的: 5 4 3 2 1


(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;

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


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

[cpp] view plain copy print ?
  1. struct cmp1  
  2. {  
  3.     bool operator ()(int x,int y)  
  4.     {  
  5.         return x>y; //小值优先   
  6.     }  
  7. };  
struct cmp1
{
bool operator ()(int x,int y)
{
return x>y; //小值优先
}
};

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

这样就创建了一个小值元素先出队列的优先队列,这里的 cmp1 作用就相当于 greater

同理我们可以写出:

[cpp] view plain copy print ?
  1. struct cmp2  
  2. {  
  3.     bool operator ()(int x,int y)  
  4.     {  
  5.         return x<y; //大值优先   
  6.     }  
  7. };  
struct cmp2
{
bool operator ()(int x,int y)
{
return x<y; //大值优先
}
};

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

这里就是创建了一个大值元素先出队列的优先队列,这里的 cmp2 作用也就是相当于 less


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

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

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

[cpp] view plain copy print ?
  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;//小值优先
}
};


[cpp] view plain copy print ?
  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值大的先出队列。

[cpp] view plain copy print ?
  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 的大小当做是优先级比较值了。下面给出另一例子,这个例子更具有一般性。

[cpp] view plain copy print ?
  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.   
  9.     for(int i = 0; i < 5; i++)  
  10.         qn.push(b[i]);  
  11.     cout<<"优先级"<<'\t'<<"值"<<endl;  
  12.     for(int i = 0; i < 5; i++)  
  13.     {  
  14.         cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;  
  15.         qn.pop();  
  16.     }  
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

这篇关于stack,queue, priority_queue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145923

相关文章

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以

Java-数据结构-栈和队列-Stack和Queue (o゚▽゚)o

文本目录: ❄️一、栈(Stack):     ▶ 1、栈的概念:   ▶ 2、栈的使用和自实现:      ☑ 1)、Stack():       ☑ 2)、push(E e):      ☑ 3)、empty():         ☑ 4)、peek(E e):        ☑ 5)、pop(E e):       ☑ 6)、size(E e):  ▶ 3、栈自实现的总代

c++stack和list 介绍

stack介绍 堆栈是一种容器适配器,专门设计用于在 LIFO 上下文(后进先出)中运行,其中元素仅从容器的一端插入和提取。 堆栈作为容器适配器实现,容器适配器是使用特定容器类的封装对象作为其基础容器 的类,提供一组特定的成员函数来访问其元素。元素从特定容器的 “back” 推送或弹出,这称为堆栈的顶部。 stack接口 stack() 构造空的栈 empty() 检测stack是否为

HDU 1297 Children’s Queue

题目: http://acm.hdu.edu.cn/showproblem.php?pid=1297 题解: D[n]表示有n个人时,满足排队要求的个数。 分类讨论: 1.第n个人为男生时,满足排队要求的个数等于D[n-1]. 2.第n个人为女生时,第n-1个必为女生,才满足要求。 此处还要进行一次分类: a.前n-2个满足排队要求时,个数为D[n-2]. b.前n-2个不满足

Elastic Stack--ES集群加密及Kibana的RBAC实战

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 学习B站博主教程笔记:  最新版适合自学的ElasticStack全套视频(Elk零基础入门到精通教程)Linux运维必备—ElasticSearch+Logstash+Kibana精讲_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1VMW3e6Ezk/?sp

C++ STL-Stack容器概念及应用方法详解

1. 再谈栈 栈是一种先进后出的数据结构,而实现方式需要创建多个结构体,通过链式的方式进行实现,这是标准的栈的思路,而在STL中栈可以以更为简单的方式实现。 概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口。 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。 栈中进入数据称为 — 入栈 push 栈中弹出数据称为 — 出

C++ STL-Queue容器概念及应用方法详解

1. 再谈队列 队列和栈不同,队列是一种先进先出的数据结构,STL的队列内容极其重要,虽然内容较少但是请务必掌握,STL的队列是快速构建搜索算法以及相关的数论图论的状态存储的基础。 概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。 队列容器允许从一端新增元素,从另一端移除元素。队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历

ORA-24067: exceeded maximum number of subscribers for queue ADMIN.SMS_MT_QUEUE

临时处理办法: delete from aq$_ss_MT_tab_D;delete from aq$_ss_MT_tab_g;delete from aq$_ss_MT_tab_h;delete from aq$_ss_MT_tab_i;delete from aq$_ss_MT_tab_p;delete from aq$_ss_MT_tab_s;delete from aq$

Elastic Stack--ES的DSL语句查询

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 学习B站博主教程笔记:  最新版适合自学的ElasticStack全套视频(Elk零基础入门到精通教程)Linux运维必备—ElasticSearch+Logstash+Kibana精讲_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1VMW3e6Ezk/?spm_