1. 程式人生 > 實用技巧 >棧 佇列與優先佇列

棧 佇列與優先佇列

棧(後進先出)

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);
			}
		}
	}