【C++】STL庫_stack_queue 的模擬實現

???????棧(Stack)、隊列(Queue)是C++ STL中的經典容器適配器

容器適配器特性

  1. 不是獨立容器,依賴底層容器(deque/vector/list)
  2. 通過限制基礎容器接口實現特定訪問模式
  3. 不支持迭代器操作(無法遍歷元素)
  4. 時間復雜度:
    • 棧/隊列操作均為O(1)
    • 底層容器影響性能:
      • vector實現棧可能導致擴容拷貝
      • list實現隊列保證穩定性能

典型應用場景:

  • 棧:函數調用棧、括號匹配、表達式求值
  • 隊列:消息隊列、BFS算法、緩沖機制

(棧和隊列前面C語言寫過,這里直接貼C++代碼)

雙端隊列:

?(不常用,簡單介紹和理解)

STL標準庫里面默認適配器使用的是deque這個容器,

? ? deque(雙端隊列)是C++標準庫中的順序容器,全稱"double-ended queue",支持在頭尾兩端高效插入/刪除元素。

?????????

  • 分段連續存儲:由多個固定大小的存儲塊(稱為緩沖區buffer)構成
  • 中控器結構:使用指針數組(map)管理存儲塊的地址

優勢:

  • 任意位置(頭尾插入)插入刪除
  • 可以隨機訪問

缺陷:

  • operator[],計算稍顯復雜,大量使用,性能下降。
  • 中間插入刪除效率不高
  • 底層角度選代器會很復雜

cur 表示當前數據
first 和 last 表示 buffer 的開始和結束
node 反向指向中控位置,方便遍歷時找下一個buffer

棧:

template<class T,class Container=deque<T>>
class stack
{
public:void push(const T& x){_con.push_back(x);}void pop();T& top(){return _con.back();}bool empty()const{return _con.empty();}size_t size(){return _con.size();}private:Container _con;};template<class T, class Container>
inline void stack<T, Container>::pop()
{_con.pop_back();
}

隊列:

template<class T, class Container = deque<T>>
class queue
{
public:void push(const T& x);void pop(){_con.pop_front();}T& back(){return _con.back();}T& front(){return _con.front();}bool empty()const{return _con.empty();}size_t size(){return _con.size();}private:Container _con;};template<class T, class Container>
inline void queue<T, Container>::push(const T& x)
{_con.push_back(x);
}

仿函數:

????????仿函數(Functor),也稱為函數對象,是通過重載operator()運算符使得類對象可以像函數一樣被調用的技術。它常用于STL算法中,提供靈活且可定制的操作邏輯。

? ? ? ? 仿函數設計出來是用來替代函數指針的。

template<class T>
struct greater 
{bool operator()(const T& l, const T& r) const {return l > r;}
};template<class T>
struct less 
{bool operator()(const T& l, const T& r) const {return l < r;}
};

????????

優先級隊列(priority_queue):

????????優先級隊列(priority_queue)是C++標準庫中的容器適配器,它基于堆數據結構實現,能夠保證隊列頭部始終是最大(默認)或最小值的元素。

? ? ? ? 底層的數據結構實際為堆(Heap)。

#include <queue>
priority_queue<int> pq; // 默認大頂堆
priority_queue<int, vector<int>, greater<int>> min_pq; // 小頂堆

PS:

  • Compare 進行比較的仿函數????????less->大堆
  • Compare 進行比較的仿函數? ? ? ? greater->小堆
//compare進行比較的仿函數 less->大堆
template<class T, class Container = vector<T>, class Compare=std::less<T>>
class priority_queue
{
public:priority_queue(){}template<class InputIterator>priority_queue(InputIterator first, InputIterator last){while (first!=last){_con.push_back(*first);++first;}//建堆for (int i = (_con.size()-1-1)/2;i>=0;--i){adjust_down(i);}}void adjust_up(size_t child){Compare com;size_t parent = (child - 1) / 2;while (child > 0){if (com(_con[parent] ,_con[child])) { //默認less 向上調整建大堆std::swap(_con[child] , _con[parent]);child = parent;parent = (child - 1) / 2;}else {break;}}}void push(const T& x){_con.push_back(x);adjust_up(_con.size()-1);}void adjust_down(size_t parent){Compare com;size_t child = parent * 2 + 1;while (child < _con.size()) {//選出左右孩子大的那一個 默認less 向下調整建小堆if (child + 1 < _con.size() && com(_con[child],_con[child+1])) {++child;}if (com(_con[parent], _con[child])) {std::swap(_con[child] , _con[parent]);parent = child; child = parent * 2 + 1;}else {break;}}}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}const T &top()const{return _con[0];}private:Container _con;
};

? ? ? ? 代碼幾乎都是前面寫過的,關鍵是C++讓其封裝起來了。

代碼還是有幾個要注意的點:

????????STL庫里面priority用greater(大于) 比較建立小堆,less(小于)比較建立小堆。所以這里要跟標準庫里面保持一致,所以要注意比較時,代碼的順序。

? ? ? ? 而這里影響位置順序的地方在向上調整和向下調整的函數上。

void adjust_up(size_t child)
{Compare com;size_t parent = (child - 1) / 2;while (child > 0){if (com(_con[parent] ,_con[child])) { std::swap(_con[child] , _con[parent]);child = parent;parent = (child - 1) / 2;}else {break;}}
}void adjust_down(size_t parent)
{Compare com;size_t child = parent * 2 + 1;while (child < _con.size()) {if (child + 1 < _con.size() && com(_con[child],_con[child+1])) {++child;}if (com(_con[parent], _con[child])) {std::swap(_con[child] , _con[parent]);parent = child; child = parent * 2 + 1;}else {break;}}
}

構建堆的復雜度差異:

  • 自底向上建堆:時間復雜度為 O(n),因為大多數節點位于低層。
  • 自頂向下建堆:時間復雜度為 O(n log n),因為每個元素插入時都可能需要 O(log n) 調整。

所以這里使用自底向上建堆。

_con[parent] > _con[child]
等價于 
_con[child] <  _con[parent] _con[parent] < _con[child]
等價于 
_con[child] >  _con[parent] 

? ? ? ? 這里寫法順序的不同,會導致代碼的意思不同。這里要跟庫里面最好保持一直。庫里面是greater(大于)建立小堆,所以這里 > 保持不變的情況下,_con[parent] 要放在左邊,?_con[child]?要放在右邊?(自頂向下建堆)?

? ? ? ? 根據代碼的意思就可以知道,如果?_con[parent] >?_con[child],則交換父子節點的數據,那么一直到根節點,數據變成了上面下,下面大的結構,就建成了小堆。同理 如果是 ?_con[child] > _con[parent],則變成了數據上面大,下面小的結構,會建成大堆。


    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/web/74515.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/web/74515.shtml
    英文地址,請注明出處:http://en.pswp.cn/web/74515.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    LangChain核心解析:掌握AI開發的“鏈“式思維

    0. 思維導圖 1. 引言 ?? 在人工智能快速發展的今天,如何有效地利用大語言模型(LLM)構建強大的應用成為眾多開發者關注的焦點。前面的課程中,我們學習了正則表達式以及向量數據庫的相關知識,了解了如何處理文檔并將其附加給大模型。本章我們將深入探討LangChain中的核心概…

    Error:java: 程序包lombok不存在

    使用Maven package打包項目發現報錯 一、Maven配置文件修改 1.找到本地 maven的配置文件settings.xml 2.修改配置文件中&#xff0c;指向本地倉庫的地址使用 ‘’ \ \ ‘’ 隔開&#xff0c; 要么使用 正斜線 / 隔開 不要使用 反斜線 \ windows OS 電腦&#xff0c;使用 \ …

    WordPress 未授權本地文件包含漏洞(CVE-2025-2294)(附腳本)

    免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 0x0…

    基于 C# 開發視覺檢測系統項目全解析

    引言 在當今高度自動化的制造業領域,視覺檢測系統的重要性愈發凸顯。它憑借高速、高精度的特性,在產品外觀缺陷檢測、尺寸測量等環節發揮著關鍵作用,顯著提升了生產效率和產品質量。C# 作為一種功能強大且易于學習的編程語言,結合.NET 框架豐富的類庫以及 Windows Forms、…

    GISBox:核心功能免費的一站式三維GIS處理平臺

    大家好&#xff0c;今天為大家介紹的軟件是GISBox&#xff1a;一款核心功能免費的一站式三維GIS處理平臺&#xff0c;主要是適用于數字孿生。下面&#xff0c;我們將從軟件的主要功能、支持的系統、軟件官網等方面對其進行簡單的介紹。 軟件官網&#xff1a;http://www.gisbox.…

    Ubuntu 24 云服務器上部署網站_詳細版_1

    從零開始&#xff0c;在 Ubuntu 24 云服務器上部署一個支持登錄和權限的網站&#xff0c;用 Python Django 實現&#xff0c;適合新手跟著操作。 &#x1f527; 第一步&#xff1a;更新服務器并安裝基礎環境 請使用 SSH 登錄你的 Ubuntu 24 云服務器&#xff08;用 MobaXterm…

    單片機學習之定時器

    定時器是用來定時的機器&#xff0c;是存在于STM32單片機中的一個外設。STM32一般總共有8個定時器&#xff0c;分別是2個高級定時器&#xff08;TIM1、TIM8&#xff09;&#xff0c;4個通用定時器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff09;和2個基本定時器&#xff08;TI…

    AIGC6——AI的哲學困境:主體性、認知邊界與“天人智一“的再思考

    引言&#xff1a;當機器開始"思考" 2023年&#xff0c;Google工程師Blake Lemoine聲稱對話AI LaMDA具有"自我意識"&#xff0c;引發軒然大波。這一事件將古老的哲學問題重新拋回公眾視野&#xff1a;?**機器能否擁有主體性&#xff1f;**從東方"天人…

    從內核到應用層:Linux緩沖機制與語言緩沖區的協同解析

    系列文章目錄 文章目錄 系列文章目錄前言一、緩沖區1.1 示例11.2 緩沖區的概念 二、緩沖區刷新方案三、緩沖區的作用及存儲 前言 上篇我們介紹了&#xff0c;文件的重定向操作以及文件描述符的概念&#xff0c;今天我們再來學習一個和文件相關的知識-----------用戶緩沖區。 在…

    高通camx IOVA內存不足,導致10-15x持續拍照后,點擊拍照鍵定屏無反應,過一會相機閃退

    定屏閃退問題分析思路&#xff1a; 定屏問題如果是相機問題&#xff0c;一般會出現返幀&#xff0c;導致預覽卡死。當然還有其他情況&#xff0c;我們先看返幀情況&#xff0c;發現request和result開始都正常&#xff0c;到12:53:05.443038就沒有返幀了&#xff0c;定屏了。往…

    AI知識補全(十五):AI可解釋性與透明度是什么?

    名人說&#xff1a;一笑出門去&#xff0c;千里落花風。——辛棄疾《水調歌頭我飲不須勸》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;AI知識補全&#xff08;十四&#xff09;&#xff1a;零樣本…

    CentOS 7安裝hyperscan

    0x00 前言 HyperScan是一款由Intel開發的高性能正則表達式匹配庫&#xff0c;專為需要快速處理大量數據流的應用場景而設計。它支持多平臺運行&#xff0c;包括Linux、Windows和macOS等操作系統&#xff0c;并針對x86架構進行了優化&#xff0c;以提供卓越的性能表現。HyperSc…

    機器學習的一百個概念(9)學習曲線

    前言 本文隸屬于專欄《機器學習的一百個概念》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見[《機器學習的一百個概念》 ima 知識庫 知識庫廣場搜索&…

    macvlan 和 ipvlan 實現原理及設計案例詳解

    一、macvlan 實現原理 1. 核心概念 macvlan 允許在單個物理網絡接口上創建多個虛擬網絡接口&#xff0c;每個虛擬接口擁有 獨立的 MAC 地址 和 IP 地址。工作模式&#xff1a; bridge 模式&#xff08;默認&#xff09;&#xff1a;虛擬接口之間可直接通信&#xff0c;類似交…

    linux文件上傳下載lrzsz

    lrzsz 是一個在 Linux 系統中用于通過串行端口(如 ZMODEM、XMODEM、YMODEM 等協議)進行文件上傳和下載的工具集。它通常用于在終端環境中通過串口或 SSH 連接傳輸文件。 安裝 lrzsz 在大多數 Linux 發行版中,你可以使用包管理器來安裝 lrzsz。 Debian/Ubuntu: sudo apt-ge…

    單片機學習之SPI

    物理層 串行全雙工總線 需要四根線&#xff1a;SCLK&#xff08;時鐘線&#xff09;&#xff0c;CS&#xff08;片選線&#xff09;、MOSI(主設備輸出、從設備輸入)&#xff0c;MISO&#xff08;主設備輸入&#xff0c;從設備輸出&#xff09;。 片選信號 片選信號CS是用來…

    大模型應用初學指南

    隨著人工智能技術的快速發展&#xff0c;檢索增強生成&#xff08;RAG&#xff09;作為一種結合檢索與生成的創新技術&#xff0c;正在重新定義信息檢索的方式&#xff0c;RAG 的核心原理及其在實際應用中的挑戰與解決方案&#xff0c;通用大模型在知識局限性、幻覺問題和數據安…

    docker-compose部署prometheus+grafana+node_exporter+alertmanager規則+郵件告警

    目錄 一.docker-compose文件 二.配置文件 三.文件層級關系&#xff0c;docker-compose和配置文件位于同級目錄 四.node_exporter頁面json文件 五.效果展示 prometheusalertmanager郵件告警 grafana面板效果 六.涉及離線包 一.docker-compose文件 [rootsulibao prometh…

    AI設計再現新引擎,科技創新又添新動能——廣東省首家行業AI設計工程中心獲批成立

    近期&#xff0c;大捷智能科技&#xff08;廣東&#xff09;有限公司&#xff08;以下簡稱“大捷智能”&#xff09;憑借其在人工智能與智能制造領域的突出研發實力與創新科技成果&#xff0c;由廣東省科技廳批準設立“廣東省模具智能設計與智能制造工程技術研究中心”。 廣東省…

    【MongoDB + 向量搜索引擎】MongoDB Atlas 向量搜索 提供全托管解決方案

    在代碼審計項目中&#xff0c;MongoDB可以用于存儲元數據和部分結構化信息&#xff0c;但要高效處理向量相似性搜索&#xff0c;需結合其他工具。以下是具體分析&#xff1a; 1. MongoDB 的適用場景 元數據存儲&#xff1a; 存儲代碼片段的文件路徑、行號、語言類型等結構化信…