C++ - STL中的queue

queue

queue模板類的定義在<queue>頭文件中噪沙。queue是容器適配器的一種次哈,用于執(zhí)行FIFO(first-in first-out)操作螺捐,從隊(duì)列尾部插入元素码秉,頭部移除元素

2-1P913113140553.jpg

queue模板類

template <class T, class Container = deque<T> > class queue;

stack模板類很相似逮矛,queue模板類也需要兩個模板參數(shù),一個是元素類型转砖,一個容器類
型须鼎,元素類型是必要的,容器類型是可選的府蔗,默認(rèn)為deque類型晋控。

namespace std
{

template <class T, class Container = deque<T>>
class queue
{
public:
    typedef Container                                container_type;
    typedef typename container_type::value_type      value_type;
    typedef typename container_type::reference       reference;
    typedef typename container_type::const_reference const_reference;
    typedef typename container_type::size_type       size_type;

protected:
    container_type c;

public:
    queue() = default;  // 默認(rèn)構(gòu)造函數(shù)
    ~queue() = default; // 默認(rèn)析構(gòu)函數(shù)

     // 構(gòu)造函數(shù)
    queue(const queue& q) = default; 
    queue(queue&& q) = default;

    queue& operator=(const queue& q) = default;
    queue& operator=(queue&& q) = default;

    explicit queue(const container_type& c);
    explicit queue(container_type&& c)


    template <class Alloc>
        explicit queue(const Alloc& a);
    template <class Alloc>
        queue(const container_type& c, const Alloc& a);
    template <class Alloc>
        queue(container_type&& c, const Alloc& a);
    template <class Alloc>
        queue(const queue& q, const Alloc& a);
    template <class Alloc>
        queue(queue&& q, const Alloc& a);

    bool      empty() const; // 是否為空
    size_type size() const; // 大小,即元素個數(shù)

    reference       front(); // 頭部元素
    const_reference front() const;
    reference       back(); // 尾部元素
    const_reference back() const;

    void push(const value_type& v); // 插入元素
    void push(value_type&& v);
    template <class... Args> reference emplace(Args&&... args); // reference in C++17
    void pop(); // 移除元素

     // 交換兩個queue
    void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
};

實(shí)戰(zhàn)

  • 基本操作
#include <iostream>
#include <queue>
using namespace std;

int main ()
{
    queue<int> myqueue;
    int sum = 0;

    // 插入元素
    for (int i=1 ;i<=10; i++)
        myqueue.push(i);

    // 隊(duì)列元素個數(shù)
    cout << "queue size: "<< myqueue.size()<<endl;

    // 隊(duì)列是否為空
    while (!myqueue.empty())
    {
        // 獲取隊(duì)列首元素
        sum += myqueue.front();
        // 首元素出隊(duì)列
        myqueue.pop();
    }

    // 輸出最后元素
    cout << "myqueue.back() is: "<< myqueue.back() <<endl;

    // 元素值總合
    cout << "total: " << sum << '\n';

    return 0;
}

運(yùn)行輸出

queue size: 10
myqueue.back() is: 10
total: 55
  • 交換兩個隊(duì)列
#include <iostream>
#include <queue>
using namespace std;


int main()
{
    // Take any two queues
    queue<char> queue1, queue2;

    int v = 96;
    for (int i = 0; i < 5; i++) {
        queue1.push(v + 1);
        v++;
    }

    for (int i = 0; i < 4; i++) {
        queue2.push(v + 1);
        v++;
    }

    // Swap elements of queues
    queue1.swap(queue2);

    // Print the first queue
    cout << "queue1 = ";
    while (!queue1.empty()) {
        cout << queue1.front() << " ";
        queue1.pop();
    }

    // Print the second set
    cout << endl << "queue2 = ";
    while (!queue2.empty()) {
        cout << queue2.front() << " ";
        queue2.pop();
    }

    return 0;
}

運(yùn)行輸出

queue1 = f g h i 
queue2 = a b c d e
  • 使用數(shù)組實(shí)現(xiàn)queue
#include <iostream>
using namespace std;

class Queue {
public:
    int front, rear, size;
    unsigned capacity;
    int *array;
};

// 創(chuàng)建隊(duì)列
Queue* createQueue(unsigned capacity) {
    Queue *queue = new Queue();
    queue->capacity = capacity;
    queue->front = queue->size = 0;
    queue->rear = capacity - 1;
    queue->array = new int [queue->capacity * sizeof(int)];
    return queue;
}

// 隊(duì)列是否已滿
int isFull(Queue *queue) {
    return queue->size == queue->capacity;
}

// 是否為空
int isEmpty(Queue *queue) {
    return queue->size == 0;
}

// 入隊(duì)列
void enqueue(Queue *queue, int item) {
    if (isFull(queue))
        return;

    queue->rear = (queue->rear + 1) % queue->capacity;
    queue->array[queue->rear] = item;
    queue->size = queue->size + 1;
    cout << item << " enqueue to queue\n";
}

// 出隊(duì)列
int dequeue(Queue *queue) {
    if (isEmpty(queue))
        return INT_MIN;

    int item = queue->array[queue->front];
    queue->front = (queue->front + 1) % queue->capacity;
    queue->size = queue->size - 1;
    return item;
}

// 首元素
int front(Queue *queue) {
    if (isEmpty(queue))
        return INT_MIN;
    return queue->array[queue->front];
}

// 尾元素
int rear(Queue *queue) {
    if (isEmpty(queue))
        return INT_MIN;
    return queue->array[queue->rear];
}

int main()
{
    Queue* queue = createQueue(100);

    enqueue(queue, 10);
    enqueue(queue, 20);
    enqueue(queue, 30);
    enqueue(queue, 40);

    cout<<dequeue(queue)<<" dequeued from queue\n";

    cout << "Front item is " << front(queue) << endl;
    cout << "Rear item is " << rear(queue) << endl;


    return 0;
}

運(yùn)行輸出

10 enqueue to queue
20 enqueue to queue
30 enqueue to queue
40 enqueue to queue
10 dequeued from queue
Front item is 20
Rear item is 40

時間復(fù)雜度:以上操作都是O(1)姓赤,enqueue(), dequeue(), isFull(), isEmpty(), front() 赡译,rear()

  • 反轉(zhuǎn)隊(duì)列
#include <iostream>
#include <queue>
#include <stack>
using namespace std;

void Print(queue<int>& Queue)
{
    while (!Queue.empty()) {
        cout << Queue.front() << " ";
        Queue.pop();
    }
}

// Function to reverse the queue
void reverseQueue(queue<int>& Queue)
{
    stack<int> Stack;
    while (!Queue.empty()) {
        Stack.push(Queue.front());
        Queue.pop();
    }
    while (!Stack.empty()) {
        Queue.push(Stack.top());
        Stack.pop();
    }
}

int main()
{
    queue<int> Queue;
    Queue.push(10);
    Queue.push(20);
    Queue.push(30);
    Queue.push(40);
    Queue.push(50);
    Queue.push(60);
    Queue.push(70);
    Queue.push(80);
    Queue.push(90);
    Queue.push(100);

    reverseQueue(Queue);
    Print(Queue);

    return 0;
}

運(yùn)行輸出

100 90 80 70 60 50 40 30 20 10

參考

queue-data-structure

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市不铆,隨后出現(xiàn)的幾起案子蝌焚,更是在濱河造成了極大的恐慌,老刑警劉巖誓斥,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只洒,死亡現(xiàn)場離奇詭異,居然都是意外死亡劳坑,警方通過查閱死者的電腦和手機(jī)毕谴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來距芬,“玉大人涝开,你說我怎么就攤上這事∶镅ǎ” “怎么了忠寻?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長存和。 經(jīng)常有香客問我奕剃,道長,這世上最難降的妖魔是什么捐腿? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任纵朋,我火速辦了婚禮,結(jié)果婚禮上茄袖,老公的妹妹穿的比我還像新娘操软。我一直安慰自己,他們只是感情好宪祥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布聂薪。 她就那樣靜靜地躺著家乘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藏澳。 梳的紋絲不亂的頭發(fā)上仁锯,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機(jī)與錄音翔悠,去河邊找鬼业崖。 笑死,一個胖子當(dāng)著我的面吹牛蓄愁,可吹牛的內(nèi)容都是我干的双炕。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼撮抓,長吁一口氣:“原來是場噩夢啊……” “哼妇斤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胀滚,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤趟济,失蹤者是張志新(化名)和其女友劉穎乱投,沒想到半個月后咽笼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戚炫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年剑刑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片双肤。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡施掏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茅糜,到底是詐尸還是另有隱情七芭,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布蔑赘,位于F島的核電站狸驳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缩赛。R本人自食惡果不足惜耙箍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酥馍。 院中可真熱鬧辩昆,春花似錦、人聲如沸旨袒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至施无,卻和暖如春术吗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帆精。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工较屿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卓练。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓隘蝎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親襟企。 傳聞我的和親對象是個殘疾皇子嘱么,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容