在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

隊列與C++中的queue詳解

冬至子 ? 來源:iDoitnow ? 作者:艱默 ? 2023-07-18 17:31 ? 次閱讀

隊列(Queue)

什么是隊列

隊列就是一種線性的數據結構,它與日常生活中排隊的隊列相似,即先進先出(LIFO, First In First Out),這點也是它與棧Stack的最大不同之處。它的結構類似于下面的容器:

圖片

如上圖所示,隊列的結構就像一個兩端都是開口的容器,一端只負責小球(對應隊列中的元素)進入,一個端只負責小球彈出,容器內部的小球無法跳過前面的小球提前彈出。我們將隊列的出口端(即隊列的頭部)叫做隊頭(front),入口端(即隊列的末尾)稱為隊尾(rear)。

與棧類似,隊列的底層數據結構也可以使用數組和鏈表來實現,具體如下圖所示:

圖片

隊列的基本操作和應用

隊列的基本操作與棧類似,主要是分為入隊(enqueue)和出隊(dequeue),我們以數組為例,簡單描述一下具體過程。

1. 入隊

入隊就是把新元素放入隊列中去,由于隊列的數據結構的限制,只允許將新入隊元素放入隊尾的位置,然后更新隊尾的位置,具體過程如下圖所示。

圖片

2. 出隊

出隊就是把隊列中的元素移出來,同樣的,隊列只允許在隊列的隊頭這一側移出元素,即每次移出的元素就是隊頭對應的元素,元素移出后,原對頭元素的后面一個元素變為新的隊頭,具體過程如下所示:

圖片

3. 入隊出隊的復雜度和應用

與棧類似,隊列的入隊與出隊只與隊頭和隊尾的元素相關,不涉及其他元素的移動,因此隊列的入隊和出隊的時間復雜度都是。

隊列先進先出的特性使得其常用于一下場景中:

  • 消息隊列:在分布式系統或異步任務處理場景中,消息隊列可以用于解耦任務的發布與消費,確保任務能夠穩定地進行下去。
  • 程序調度:操作系統、多線程程序、并發網絡程序等需要協調多個任務的程序中,通常會使用隊列來維護任務的執行順序,以保證每個任務都能夠得到執行。
  • 廣度優先搜索:在圖論、路徑查找等問題中,廣度優先搜索算法通常會使用隊列來存儲待搜索的節點,以確保每一層的所有節點都可以被訪問到。
  • 緩存:在許多應用中,緩存通常使用隊列來管理緩存項的過期時間和更替策略,使得緩存可以高效地使用有限的內存資源。

類模板std::queue

std::queue類是C++提供的容器適配器,它提供了特定的函數集合,實現了隊列的基本功能:FIFO的數據結構,即在容器的尾端推入元素,在首段彈出元素。std::queue類在頭文件中定義,其函數聲明如下:

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

形參T和Container

  • T :存儲的元素類型。
  • Container :用于存儲元素的底層容器。容器類型必須是序列容器,同時,該容器類型需提供通常語義下的back()、front()、push_back()和pop_front()函數,滿足該要求的標準容器有std::deque和std::list,其中默認使用的容器是std::deque。

成員函數

1. 元素訪問
  • front :訪問隊列第一個元素。其函數聲明如下:
reference front();
const_reference front() const;

該函數返回隊列中首個元素的引用,實際上該函數等效的調用的就是存儲元素的底層容器(Container)的front()函數。

  • back :訪問隊列最后一個元素。其函數聲明如下:
reference back();
const_reference back() const;

該函數返回的是隊列末尾元素的引用,實際上該函數等效的調用的就是Container的back()函數。

2. 容量
  • empty :檢查隊列是否為空。其函數聲明如下:
bool empty() const; // C++20 前
[[nodiscard]] bool empty() const; //C++20 起

其本質上就是檢查Container是否為空,即Container的empty()。如果為空返回true,否則為false。

  • size :返回隊列中的元素個數。其函數聲明如如下:
size_type size() const;

同樣的,其本質還是返回的是Container的元素個數,即Container的size()。

3. 隊列的修改
  • push :向隊列的尾部插入元素,對應的就是入隊操作。其函數聲明如下:
void push( const value_type& value );
void push( value_type&& value ); //C++11 起
  • emplace :在隊列的尾部構造元素,對應的也是入隊的操作。其函數聲明如下:
template< class... Args >
void emplace( Args&&... args );// C++11 起  C++17 前
template< class... Args >
decltype(auto) emplace( Args&&... args );// C++17 起

該函數就是將新元素推到隊列的尾部,其與push不同的是:該函數是原地構造元素,即不進行移動或復制操作,使用參數直接原地調用元素的構造函數,使得其效率高于push。

  • pop :刪除隊列首個元素,對應的就是出隊操作。其函數聲明如下:
void pop();

該函數移除隊列前端的元素,等效的調用了Container的pop_front()函數。

  • swap :交換兩個容器的內容。其函數聲明如下:
void swap( queue& other ) noexcept(); //C++11 起

其本質上是交換兩個Container中的內容。

用法示例

#include < iostream >
#include < queue >
using namespace std;

void showQueue(string queueName, queue< int >& q) {
    cout < < "隊列" < < queueName < < "中元素的數量, 即size() = " < < q.size()
        < < endl;
    if (!q.empty()) {
        cout < < "此時, 隊列" < < queueName < < "不為空,即empty() = false" < < endl;
        cout < < "隊列首位元素,即front() =  " < < q.front() < < endl;
        cout < < "隊列首位元素,即back() =  " < < q.back() < < endl;
    } else {
        cout < < "此時, 隊列" < < queueName < < "為空,即empty() = true" < < endl;
    }
}

int main() {
    queue< int > q;

    // push()
    q.push(1);
    q.push(2);
    q.push(3);

    cout < < "---按順push元素1、2、3后:n" < < endl;
    showQueue("q", q);

    q.pop();  // 彈出隊頭元素
    cout < < "n---彈出隊頭元素3, 即pop()后:n" < < endl;
    showQueue("q", q);

    q.pop();
    cout < < "n---彈出隊頭元素2, 即pop()后:n" < < endl;
    showQueue("q", q);

    q.pop();
    cout < < "n---彈出隊頭元素1, 即pop()后:n" < < endl;
    showQueue("q", q);

    queue< int > q1;
    q1.emplace(1);
    q1.emplace(2);
    q1.emplace(3);

    cout < < "n-----------隊列q和q1交換前----------" < < endl;
    cout < < "nq的狀態: " < < endl;
    showQueue("q", q);

    cout < < "nq1的狀態: " < < endl;
    showQueue("q1", q1);

    q1.swap(q);  // s和s1進行交換

    cout < < "n-----------隊列q和q1交換后----------n" < < endl;
    showQueue("q", q);

    cout < < "nq1的狀態: " < < endl;
    showQueue("q1", q1);

    return 0;
}

輸出結果:

---按順push元素123后:

隊列q中元素的數量, 即size() = 3
此時, 隊列q不為空,即empty() = false
隊列首位元素,即front() =  1
隊列首位元素,即back() =  3

---彈出隊頭元素3, 即pop()后:

隊列q中元素的數量, 即size() = 2
此時, 隊列q不為空,即empty() = false
隊列首位元素,即front() =  2
隊列首位元素,即back() =  3

---彈出隊頭元素2, 即pop()后:

隊列q中元素的數量, 即size() = 1
此時, 隊列q不為空,即empty() = false
隊列首位元素,即front() =  3
隊列首位元素,即back() =  3

---彈出隊頭元素1, 即pop()后:

隊列q中元素的數量, 即size() = 0
此時, 隊列q為空,即empty() = true

-----------隊列q和q1交換前----------

q的狀態: 
隊列q中元素的數量, 即size() = 0
此時, 隊列q為空,即empty() = true

q1的狀態: 
隊列q1中元素的數量, 即size() = 3
此時, 隊列q1不為空,即empty() = false
隊列首位元素,即front() =  1
隊列首位元素,即back() =  3

-----------隊列q和q1交換后----------

隊列q中元素的數量, 即size() = 3
此時, 隊列q不為空,即empty() = false
隊列首位元素,即front() =  1
隊列首位元素,即back() =  3

q1的狀態: 
隊列q1中元素的數量, 即size() = 0
此時, 隊列q1為空,即empty() = true
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 適配器
    +關注

    關注

    8

    文章

    1952

    瀏覽量

    68024
  • 緩存器
    +關注

    關注

    0

    文章

    63

    瀏覽量

    11659
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6992
  • FIFO存儲
    +關注

    關注

    0

    文章

    103

    瀏覽量

    5973
收藏 人收藏

    評論

    相關推薦

    Queue隊列的作用是什么

    文章目錄前言Queue 隊列semaphore 信號量Mutex 互斥量微信公眾號前言FreeRTOS STM32CubeMX配置 內存管理 任務管理上節介紹了用STM32CubeMX生成帶
    發表于 02-14 06:57

    消息隊列Queue相關資料推薦

    消息隊列QueueAPItx_queue_createtx_queue_deletex_queue_flushtx_queue_front_sendtx_queue_receivetx_queue_send_notifyAPItx_queue_createtx_queue_del
    發表于 02-22 06:53

    RT-Thread的data_queue是什么?怎樣去使用

    1. data_queue 是什么data_queue 直接翻譯過來是 數據隊列。這個名字和 消息隊列 很像。那么他們有什么區別呢?消息隊列
    發表于 04-15 15:56

    OpenHarmony:內核對象隊列之算法詳解(下)

    ,在上一期發布的《OpenHarmony——內核對象隊列之算法詳解(上)》文章,我分享了OpenHarmonyLiteOS-M內核對象隊列的FIFO的算法,今天給大家介紹另外一種算法
    發表于 08-09 10:25

    OpenHarmony:內核對象隊列之算法詳解(上)

    [OS_QUEUE_WRITE]: 消息節點循環隊列可寫的消息個數,為 0 表示循環隊列為滿,等于 queueLen 表示循環隊列為空。r
    發表于 08-09 10:29

    OpenHarmony——內核對象隊列之算法詳解(下)

    LiteOS-M內核對象隊列的算法包括FIFO和FILO,在上一期發布的《OpenHarmony-內核對象隊列之算法詳解(上)》文章,我分享了OpenHarmonyLiteOS-M
    發表于 08-09 16:16

    圖文詳解C++虛表的剖析

    圖文詳解C++虛表的剖析
    的頭像 發表于 06-29 14:23 ?2541次閱讀
    圖文<b class='flag-5'>詳解</b>:<b class='flag-5'>C++</b>虛表的剖析

    圖文詳解C++的輸出輸入

    圖文詳解C++的輸出輸入
    的頭像 發表于 06-29 14:53 ?3387次閱讀
    圖文<b class='flag-5'>詳解</b>:<b class='flag-5'>C++</b>的輸出輸入

    ThreadX(九)------消息隊列Queue

    消息隊列QueueAPItx_queue_createtx_queue_deletex_queue_flushtx_queue_front_sendtx_queue_receivetx_queue_send_notifyAPItx_queue_createtx_queue_del
    發表于 12-28 19:35 ?2次下載
    ThreadX(九)------消息<b class='flag-5'>隊列</b><b class='flag-5'>Queue</b>

    隊列Queue的常用方法有哪些

    FIFO(先入先出)隊列Queue,LIFO(后入先出)隊列LifoQueue,和優先級隊列PriorityQueue。
    的頭像 發表于 08-19 10:24 ?5752次閱讀
    <b class='flag-5'>隊列</b><b class='flag-5'>Queue</b>的常用方法有哪些

    STM32G0開發筆記:使用FreeRTOS系統的隊列Queue

    使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面為使用FreeRTOS系統的隊列Queue
    的頭像 發表于 01-16 14:50 ?1393次閱讀

    什么是queue

    queue 容器,又稱隊列容器,是簡單地裝飾deque容器而成為另外的一種容器。
    的頭像 發表于 02-27 15:43 ?1655次閱讀

    利用C++提供的隊列封裝一個消息隊列

    最近的C++項目中,需要用到消息隊列,但是C++又沒有原生的消息隊列,就在網上找了一下相關資料,利用C
    的頭像 發表于 05-20 15:16 ?1872次閱讀
    利用<b class='flag-5'>C++</b>提供的<b class='flag-5'>隊列</b>封裝一個消息<b class='flag-5'>隊列</b>

    FreeRTOS消息隊列結構體

    有一個結構體用于描述隊列,叫做 Queue_t,這個結構體在文件 queue.c 定義。 3、隊列創建 在使用
    的頭像 發表于 07-06 17:03 ?1106次閱讀
    FreeRTOS消息<b class='flag-5'>隊列</b>結構體

    RTOSQueue的工作原理

    Queue即消息隊列是通過RTOS內核提供的一種服務。它是一種線程間同步數據的安全方法。
    的頭像 發表于 07-25 15:45 ?3536次閱讀
    RTOS<b class='flag-5'>中</b><b class='flag-5'>Queue</b>的工作原理
    主站蜘蛛池模板: 四虎永久在线精品2022| 日本天堂网在线观看| 成年香蕉大黄美女美女| 久久午夜精品| 亚洲1区2区3区4区| 一级做a爰片久久毛片鸭王| 国产在线成人一区二区| 日本一卡二卡≡卡四卡精品| a网在线| 欧洲成人r片在线观看| 999久久久免费精品国产牛牛| 丁香激情六月天| 四虎884| 91美女在线播放| jdav视频在线观看| 色播在线| 天天摸天天摸天天躁| 完全免费在线视频| 四虎国产欧美成人影院| 伊人久久影视| 亚洲一级视频在线观看| 欧美一级片观看| 99成人在线| 一区二区在线看| 四只虎免费永久观看| 一级片在线播放| 亚洲免费视频网| 日本黄色高清视频网站| 人人人人干| 日本高清一区二区三区不卡免费| 四虎影免看黄| 天天舔天天干| 亚洲成人免费网站| 就要爱综合| 天天操天天爽天天射| 亚洲情欲网| 久久99久久精品97久久综合| 国产精品爽爽影院在线| 涩久久| 在线播放免费| 国产精品久久久久免费|