栈 队列与优先队列
栈(后进先出)
1.头文件及声明方式
2.入出取栈元素:
push()和pop()实现元素的入栈和出栈的操作,top()取出栈顶的元素,但是并不删除元素;
队列
1.头文件及声明方式
:
2.入出取:
push()和pop()实现元素的入队和出队操作,front()取出队首的元素,但是并不删除;
优先队列
1.含义:
优先队列是一种抽象的数据类型,行为有些像队列,但先出去队列的元素并不是先进队列的元素,而是队列中优先级最高的元素。
2.头文件及声明方式:
3.例子:
题目:要实现一个“个位数大的整数优先级反而小”的优先队列。
分析:定义一个结构体cmp,重载“()”运算符,用"priority_queue<int,vector
下面是cmp的定义:
struct cmp{
bool operator()(const int a,const int b) const{//a的优先级比b小的时候返回true
return a%10>b%10;
}
};
附加:
如果是“越小的整数优先级越大的优先队列”则可以写成“priority_queue<int,vector
优先队列例题:
题目:丑数是指不能被2 3 5 以外的其他素数整除的数字,把丑数从小到大排列起来,结果如下:1,2,3,4,5,6,8,9,10,12,15,......
分析:因为最小的丑数是1,而对于任意丑数下x,2x,3x,5x也就都是丑数,所以用一个优先队列保存所有已经生成的丑数,每次取出最小的丑数(这里也就是为什么用的是越小的整数优先级越大的优先队列的原因),但是像12这些数,既可以被2又可以3,所以用集合(每个元素只能出现一次)。
const int aa[3] = { 2,3,5 };
typedef long long ll;
priority_queue<ll, vector<ll>, greater<ll> >pq;//"越小的整数优先级越大"
set<ll>s;
pq.push(1);
s.insert(1);
for (int i = 1;; i++)
{
ll x = pq.top(); pq.pop();
if (i == 7)
{
cout << x << endl;
break;
}
for (int i = 0; i < 3; i++)
{
ll x2 = x * aa[i];
if (!s.count(x2))
{
s.insert(x2); pq.push(x2);
}
}
}
作者:Better又
出处:https://www.cnblogs.com/lwyy1223-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。