花花生米

导航

栈 队列与优先队列

栈(后进先出)

1.头文件及声明方式

中,声明方式:stacks;

2.入出取栈元素:

push()和pop()实现元素的入栈和出栈的操作,top()取出栈顶的元素,但是并不删除元素;

队列

1.头文件及声明方式


queues声明

2.入出取:

push()和pop()实现元素的入队和出队操作,front()取出队首的元素,但是并不删除;

优先队列

1.含义:

优先队列是一种抽象的数据类型,行为有些像队列,但先出去队列的元素并不是先进队列的元素,而是队列中优先级最高的元素。

2.头文件及声明方式:

声明方式:priority_queuepq;其中的pq是一个“越小的整数优先级越低的优先队列”,并且出队列的方法不是front()了,而是top().

3.例子:

题目:要实现一个“个位数大的整数优先级反而小”的优先队列。
分析:定义一个结构体cmp,重载“()”运算符,用"priority_queue<int,vector,cmp>pq"的方式定义。
下面是cmp的定义:

struct cmp{
bool operator()(const int a,const int b) const{//a的优先级比b小的时候返回true
      return a%10>b%10;
      }
};

附加:

如果是“越小的整数优先级越大的优先队列”则可以写成“priority_queue<int,vector,greater >pq”;注意最后两个“>”符号不要写在一起了;

优先队列例题:

题目:丑数是指不能被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);
			}
		}
	}

posted on 2020-08-18 17:36  花花生米  阅读(284)  评论(0编辑  收藏  举报