數(shù)據(jù)結(jié)構(gòu)--隊(duì)列

隊(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_queuequeue不同的就在于可以自定義其中數(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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容