隊(duì)列(queue)是一種具有「先進(jìn)入隊(duì)列的元素一定先出隊(duì)列」性質(zhì)的表。由于該性質(zhì),隊(duì)列通常也被稱為先進(jìn)先出(first in first out)表,簡(jiǎn)稱 FIFO 表。
C++ STL 中實(shí)現(xiàn)了 隊(duì)列 std::queue 和 優(yōu)先隊(duì)列 std::priority_queue 兩個(gè)類,定義于頭文件 <queue> 中。
隊(duì)列(queue)
std::queue是容器適配器,默認(rèn)的底層容器為雙端隊(duì)列std::deque。
q.empty() 如果隊(duì)列為空返回true,否則返回false
q.size() 返回隊(duì)列中元素的個(gè)數(shù)
q.pop() 刪除隊(duì)列首元素但不返回其值
q.front() 返回隊(duì)首元素的值,但不刪除該元素
q.push() 在隊(duì)尾壓入新元素
q.back() 返回隊(duì)列尾元素的值,但不刪除該元素
優(yōu)先隊(duì)列(priority_queue)
priority_queue和queue不同的就在于可以自定義其中數(shù)據(jù)的優(yōu)先級(jí), 讓優(yōu)先級(jí)高的排在隊(duì)列前面,優(yōu)先出隊(duì)。
優(yōu)先隊(duì)列具有隊(duì)列的所有特性,包括隊(duì)列的基本操作,只是在這基礎(chǔ)上添加了內(nèi)部的一個(gè)排序,它本質(zhì)是一個(gè)堆實(shí)現(xiàn)的。
q.top() 訪問隊(duì)頭元素
q.empty() 隊(duì)列是否為空
q.size() 返回隊(duì)列內(nèi)元素個(gè)數(shù)
q.push() 插入元素到隊(duì)尾 (并排序)
q.emplace() 原地構(gòu)造一個(gè)元素并插入隊(duì)列
q.pop() 彈出隊(duì)頭元素
q.swap() 交換內(nèi)容
定義:priority_queue<Type, Container, Functional>
Type就是數(shù)據(jù)類型,Container就是容器類型(Container必須是用數(shù)組實(shí)現(xiàn)的容器,比如vector,deque等等,但不能用list。STL里面默認(rèn)用的是vector),Functional就是比較的方式。當(dāng)需要用自定義的數(shù)據(jù)類型時(shí)才需要傳入這三個(gè)參數(shù),使用基本數(shù)據(jù)類型時(shí),只需要傳入數(shù)據(jù)類型,默認(rèn)是大頂堆。
一般是:
//升序隊(duì)列,小頂堆
priority_queue <int,vector<int>,greater<int> > q;
//降序隊(duì)列,大頂堆
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std實(shí)現(xiàn)的兩個(gè)仿函數(shù)(就是使一個(gè)類的使用看上去像一個(gè)函數(shù)。其實(shí)現(xiàn)就是類中實(shí)現(xiàn)一個(gè)operator(),這個(gè)類就有了類似函數(shù)的行為,就是一個(gè)仿函數(shù)類了)
自定義數(shù)據(jù)類型和比較規(guī)則:
struct TMP{
int x;
string s;
TMP( int a= 0, string b= "" ):
x(a), s(b) {}
};
struct cmp{
bool operator () ( TMP a, TMP b ){//返回true,a的優(yōu)先級(jí)大于b
//x大的排在隊(duì)前部;x相同時(shí),y大的排在隊(duì)前部
if( a.x== b.x ) return a.s< b.s;
return a.x> b.x;
}
};
priority_queue<TMP ,vector<TMP>,cmp > ans;
[參考鏈接]
https://www.cnblogs.com/huashanqingzhu/p/11040390.html
https://blog.csdn.net/u014609638/article/details/106987131
https://oi-wiki.org/ds/queue/