栈:
栈是先入后出,后入先出
有push()和pop()两种操作 使用时定义是stack<int> s; top()操作是取栈顶的元素 但是不去删除
在集合计算机的问题中的一段code、解释: if (IDcache.cout(x)) return IDcache[x] 、、 是如若找到集合x就返回他的id
队列
队列是 先如先出的 就像通道
定义是 queue<int>s push() pop() 进行入队和出队的操作 front ()是取队首的操纵
STL的优先队列也是和队列同头文件件 定义是 priority_queue<int>s;实现
例如: 实现一个个数位大的优先级反而小的队列
priority_queue<int,vector<int>,cmp>PQ CMP的定义
实现优先队列这个越小越大的队列
priority_queue<LL,vector<LL>,greater<LL>pq;
看丑数问题
//丑数是一个正整数,其素数因子只有2,3,5. 例如,6,8是丑数 (因为6 = 2*3, 8=2*2*2),而14不是丑数(14=2*7)因为其素数因子包含7.
//注意:1是一个特例,也将其看做一个素数
#include<iostream>
#include<vector>
#include<set>
#include<queue>
using namespace std;
typedef long long LL;//定义long long 类型的别名
const int coeff[3]={2,3,5};//定义基础数组
int main(){
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();//第一元素出队列 所以 第1500个丑数就是pop1499后的那个元素
if(i==1500){
cout<<"The 1500'th ugly number is "<<x<<".\n";//输出第1500个丑数
break;//跳出循环
}
for(int j=0;j<3;j++){
LL x2=x*coeff[j];//x2是2 3 5的倍数
//判断集合中有没有x2 若没有进入if中
if(!s.count(x2)){
s.insert(x2);//插入到s集合中
pq.push(x2);//进队列
}
}
}
return 0;
}
在此题的解析中使用集合set 也可用sort从新paixu和队列queue排序的使用