深入探討【C++容器適配器】:現代編程中的【Stack與Queue】的實現

目錄

一、Stack(棧)

1.1 Stack的介紹

1.2 Stack的使用

1.3 Stack的模擬實現

二、Queue(隊列)

2.1 Queue的介紹

2.2 Queue的使用

2.3 Queue的模擬實現

三、容器適配器

3.1 什么是適配器

3.2 為什么選擇deque作為stack和queue的底層默認容器

?編輯

總結


?

專欄:C++學習筆記?

上一卷:C++—list容器

在C++中,stackqueue是兩種非常重要的數據結構,廣泛應用于各種算法和系統中。本文將詳細介紹這兩種數據結構的基本概念、使用方法及其底層實現,并結合代碼示例和運行結果進行詳細講解。

一、Stack(棧)

1.1 Stack的介紹

stack(棧)是一種容器適配器,專門用于后進先出(LIFO, Last In First Out)的操作環境中。棧的元素插入和刪除操作只能在容器的一端進行,即棧頂。

棧的底層容器可以是任何標準的容器類模板或一些其他特定的容器類,這些容器類應支持以下操作:

  • empty(): 判空操作
  • back(): 獲取尾部元素操作
  • push_back(): 尾部插入元素操作
  • pop_back(): 尾部刪除元素操作

標準容器vectordequelist均符合這些需求,默認情況下,如果沒有為stack指定特定的底層容器,默認情況下使用deque

小李的理解:
棧就像是一疊盤子,你只能從頂部添加或移除盤子。這就意味著最后添加的盤子最先被移除(后進先出)。在C++中,棧的底層可以用多種容器實現,但一般默認用deque,因為它支持高效的尾部操作。

1.2 Stack的使用

stack的常用操作包括:

  • stack(): 構造空的棧
  • empty(): 檢測stack是否為空
  • size(): 返回stack中元素的個數
  • top(): 返回棧頂元素的引用
  • push(val): 將元素val壓入stack中
  • pop(): 將stack中尾部的元素彈出

示例代碼

#include <stack>
#include <iostream>int main() {std::stack<int> s;s.push(1);s.push(2);s.push(3);std::cout << "Stack top: " << s.top() << std::endl; // 輸出3s.pop();std::cout << "Stack top after pop: " << s.top() << std::endl; // 輸出2return 0;
}

首先我們壓入了三個元素1, 2, 3,棧頂元素是3。然后我們彈出了棧頂元素,棧頂變成了2。

小李的理解:
就像把三個盤子按順序疊起來(1在最底下,3在最上面)。當我們移走最上面的盤子時,下面的盤子就成了新的頂部。

1.3 Stack的模擬實現

從棧的接口中可以看出,棧實際是一種特殊的vector,因此使用vector完全可以模擬實現stack

示例代碼

#include <vector>
#include <iostream>namespace bite {template<class T>class stack {public:stack() {}void push(const T& x) { _c.push_back(x); }void pop() { _c.pop_back(); }T& top() { return _c.back(); }const T& top() const { return _c.back(); }size_t size() const { return _c.size(); }bool empty() const { return _c.empty(); }private:std::vector<T> _c;};
}int main() {bite::stack<int> s;s.push(1);s.push(2);s.push(3);std::cout << "Custom stack top: " << s.top() << std::endl; // 輸出3s.pop();std::cout << "Custom stack top after pop: " << s.top() << std::endl; // 輸出2return 0;
}

這表明我們的自定義stack實現與標準庫中的行為一致。

小李的理解:
我們自己實現了一個簡單的棧,用vector來存儲元素。每次添加元素時,將它們推到vector的尾部;每次移除元素時,從vector的尾部移除。這和我們平時用的棧行為完全一樣。

二、Queue(隊列)

2.1 Queue的介紹

queue(隊列)是一種容器適配器,專門用于先進先出(FIFO, First In First Out)的操作環境中。隊列的元素插入操作在容器的一端進行,即隊尾,而提取操作在容器的另一端進行,即隊頭。

隊列的底層容器可以是標準容器類模板之一,也可以是其他專門設計的容器類。這些容器類應支持以下操作:

  • empty(): 檢測隊列是否為空
  • size(): 返回隊列中有效元素的個數
  • front(): 返回隊頭元素的引用
  • back(): 返回隊尾元素的引用
  • push_back(): 在隊列尾部插入元素
  • pop_front(): 在隊列頭部刪除元素

標準容器dequelist滿足這些要求。默認情況下,如果沒有為queue指定特定的底層容器,則使用deque

小李的理解:
隊列就像排隊買票,最早來的人最先買到票(先進先出)。在C++中,隊列的底層可以用多種容器實現,但一般默認用deque,因為它支持高效的頭尾操作。

2.2 Queue的使用

queue的常用操作包括:

  • queue(): 構造空的隊列
  • empty(): 檢測隊列是否為空
  • size(): 返回隊列中有效元素的個數
  • front(): 返回隊頭元素的引用
  • back(): 返回隊尾元素的引用
  • push(val): 在隊尾將元素val入隊列
  • pop(): 將隊頭元素出隊列

示例代碼

#include <queue>
#include <iostream>int main() {std::queue<int> q;q.push(1);q.push(2);q.push(3);std::cout << "Queue front: " << q.front() << std::endl; // 輸出1q.pop();std::cout << "Queue front after pop: " << q.front() << std::endl; // 輸出2return 0;
}

首先我們壓入了三個元素1, 2, 3,隊頭元素是1。然后我們彈出了隊頭元素,隊頭變成了2。

小李的理解:
就像排隊買票,第一個人買了票離開,第二個人就成了最前面的人。

2.3 Queue的模擬實現

因為queue的接口中存在頭刪和尾插,因此使用vector來封裝效率太低,故可以借助list來模擬實現queue

示例代碼

#include <list>
#include <iostream>namespace bite {template<class T>class queue {public:queue() {}void push(const T& x) { _c.push_back(x); }void pop() { _c.pop_front(); }T& back() { return _c.back(); }const T& back() const { return _c.back(); }T& front() { return _c.front(); }const T& front() const { return _c.front(); }size_t size() const { return _c.size(); }bool empty() const { return _c.empty(); }private:std::list<T> _c;};
}int main() {bite::queue<int> q;q.push(1);q.push(2);q.push(3);std::cout << "Custom queue front: " << q.front() << std::endl; // 輸出1q.pop();std::cout << "Custom queue front after pop: " << q.front() << std::endl; // 輸出2return 0;
}

?

這表明我們的自定義queue實現與標準庫中的行為一致。

小李的理解:
我們自己實現了一個簡單的隊列,用list來存儲元素。每次添加元素時,將它們推到list的尾部;每次移除元素時,從list的頭部移除。這和我們平時用的隊列行為完全一樣。

三、容器適配器

3.1 什么是適配器

適配器是一種設計模式,該模式是將一個類的接口轉換成客戶希望的另外一個接口。在STL中,stackqueue就是通過適配器模式將dequevector等容器類的接口轉換成特定的LIFO或FIFO操作。

3.2 為什么選擇deque作為stack和queue的底層默認容器

雖然stackqueue中也可以存放元素,但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器適配器,這是因為stackqueue只是對其他容器的接口進行了包裝,STL中stackqueue默認使用deque。主要原因如下:

  1. stackqueue不需要遍歷(因此stackqueue沒有迭代器),只需要在固定的一端或者兩端進行操作。
  2. stack中元素增長時,dequevector的效率高(擴容時不需要搬移大量數據);queue中的元素增長時,deque不僅效率高,而且內存使用率高。

結合了deque的優點,而完美地避開了其缺陷,使其成為stackqueue的理想底層容器。

總結

C++中的stackqueue通過容器適配器實現,分別用于LIFO和FIFO操作。stackqueue的底層容器默認使用deque,但也可以根據需求選擇其他標準容器。理解并靈活運用這些數據結構,對于高效編寫算法和處理復雜數據具有重要意義。

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

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

相關文章

kylin入門教程

Apache Kylin的入門教程主要涵蓋以下幾個方面&#xff1a; 一、Apache Kylin簡介 Apache Kylin是一個開源的分布式分析引擎&#xff0c;提供Hadoop之上的SQL接口及多維分析&#xff08;OLAP&#xff09;能力以支持超大規模數據。最初由eBay Inc.開發并貢獻至開源社區&#xf…

基于Vue和UCharts的前端組件化開發:實現高效、可維護的詞云圖與進度條組件

基于Vue和UCharts的前端組件化開發&#xff1a;實現高效、可維護的詞云圖與進度條組件 摘要 隨著前端技術的迅速發展和業務場景的日益復雜&#xff0c;傳統的整塊應用開發方式已無法滿足現代開發的需求。組件化開發作為一種有效的解決方案&#xff0c;能夠將系統拆分為獨立、…

Shell基礎之函數和數組

目錄 函數 什么是函數 函數的語法 函數的調用 函數的返回值 函數的案例 函數變量的作用域 遞歸函數 函數庫文件 數組 定義數組語法 數組操作 獲取所有元素 獲取元素下標 獲取數組長度 獲取數組元素 數組添加元素 刪除數組元素 刪除數組 遍歷數組元素 數組案…

解決pycharm無法識別miniconda

解決pycharm無法識別miniconda 找到miniconda安裝目錄下condabin/conda.bat文件&#xff0c;點擊load即可識別codna環境 a環境

Spring Boot(七十九):SprngBoot整合Apache tika做文件類型檢測

之前有一個章節介紹了Apache tika實現文檔內容解析,地址如下:Spring Boot(六十八):SpringBoot 整合Apache tika 實現文檔內容解析_springboot tika pptx-CSDN博客 下面我們介紹Apache tika實現文件類型檢測 1 引入依賴 <dependency><groupId>org.apache.tika&…

Docker 掛載目錄空間占滿修改/var/lib/docker/overlay2 的路徑解決方案

本文詳細描述了在CentOS7系統中卸載舊版Docker、安裝依賴、添加Docker源、配置存儲路徑并啟動Docker&#xff0c;使其在/home目錄下運行的過程。 以下是在CentOS 7下重新安裝Docker并將其安裝在/home/下的完整步驟&#xff1a; 卸載舊版本的Docker。如果您之前已經安裝了Dock…

仕考網:沒有學位證能考公務員嗎?

公務員考試需要滿足報名條件才能參加&#xff0c;沒有學位證能考公嗎? 沒有學位證書的考生也有機會參與公務員考試雖然可以選擇的崗位比較少&#xff0c;但可以報考參加那些不設定學位要求的崗位。當發布的公務員招錄信息中某一職位的學位要求標注為“無要求”時&#xff0c;…

【C++】:繼承[下篇](友元靜態成員菱形繼承菱形虛擬繼承)

目錄 一&#xff0c;繼承與友元二&#xff0c;繼承與靜態成員三&#xff0c;復雜的菱形繼承及菱形虛擬繼承四&#xff0c;繼承的總結和反思 點擊跳轉上一篇文章&#xff1a; 【C】&#xff1a;繼承(定義&&賦值兼容轉換&&作用域&&派生類的默認成員函數…

MATLAB Gazebo聯合仿真

準備仿真環境&#xff1a;在Gazebo中設置仿真場景&#xff0c;包括機器人模型、環境布局、傳感器和執行器等。編寫MATLAB腳本&#xff1a;在MATLAB中編寫控制算法和數據處理腳本&#xff0c;用于接收Gazebo中的傳感器數據&#xff0c;并生成控制命令。建立通信&#xff1a;通過…

DEBUG:jeston卡 遠程ssh編程

問題 jeston 打開網頁 gpt都不方便 而且只需要敲命令就行 解決 下載MobaXterm(window執行) liunx需要虛擬機 軟件 遠程快速復制命令

PHP文字ocr識別接口示例、人工智能的發展

全球在人工智能升級的大背景下&#xff0c;有一定規模的制造商開始大量部署人工智能機器人、系統&#xff0c;以此取代危險、簡單和重復性的工作。各種人工智能技術的迅猛發展&#xff0c;正在驅動各行業就業市場發現變革。 京東物流大家并不陌生&#xff0c;京東快遞機器人在…

vue中table內容和lable對不齊解決方案

問題&#xff1a; 代碼片段&#xff1a; <template><el-table :data"tableData" stripe style"width: 100%"><el-table-column prop"title" label"標題" width"80px" /><el-table-column prop"n…

Windows安全日志導致環境內存占用過高

Windows 環境內存占用高不釋放&#xff0c;目前遇到的常見情況如下&#xff1a; 情況一&#xff1a;JVM內存泄漏 這種網上的排查方式有很多&#xff0c;自行查閱即可 情況二&#xff1a;SQLserver內存配置過大 這種也是&#xff0c;從網上查找修改方式然后修改即可 情況三…

python的面向對象編程

為什么要面向對象編程&#xff1f; 偉大的領袖毛澤東曾說過&#xff1a;編程最大的敵人是重復。 最開始&#xff0c;在程序中寫的一條條語句&#xff0c;在執行的時候會變成一條條指令交給CPU執行。這就是**“程序是指令的集合”** 。為了簡化程序的設計&#xff0c;引入了函數…

WebPages 全局:深入解析現代網頁設計與開發

WebPages 全局:深入解析現代網頁設計與開發 引言 隨著互聯網技術的飛速發展,網頁設計與開發已經成為了數字化時代的重要組成部分。從簡單的文本和圖像展示,到如今復雜的多媒體交互體驗,網頁設計經歷了翻天覆地的變化。本文將深入探討WebPages全局,包括網頁設計的基本概念…

Defensor 4.5:構建數據資產為中心的安全運營體系

5月31日“向星力”未來數據技術峰會上&#xff0c;星環科技重磅發布數據安全管理平臺 Defensor 4.5版本。新版本引入了以數據資產為中心的數據安全運營體系&#xff0c;通過智能化大模型技術&#xff0c;幫助企業快速、精準地識別核心重要資產&#xff1b;建設全局的數據安全策…

pytorch GPU cuda 使用 報錯 整理

GPU 使用、報錯整理 1. 使用指定GPU&#xff08;單卡&#xff09;1.1 方法1&#xff1a;os.environ[CUDA_VISIBLE_DEVICES]1.2 方法2&#xff1a;torch.device(cuda:2)1.3 報錯1&#xff1a;RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asy…

MySQL學習記錄 —— ?? 常用程序和配置文件

文章目錄 1、mysqld2、mysql常用命令介紹 3、配置文件語法 1、mysqld mysqld就是MySQL服務器&#xff0c;是一個多線程程序。對數據目錄&#xff0c;即mysql的主要工作目錄進行訪問管理。當mysqld啟動時&#xff0c;會偵聽指定的端口&#xff0c;處理來自客戶端程序的網絡連接…

【vue教程】二. Vue特性原理詳解

目錄 回顧本章涵蓋知識點Vue 實例和選項創建 Vue 實例Vue 實例的選項 Vue 模板語法插值表達式指令v-bindv-modelv-on 自定義指令創建自定義指令在模板中使用自定義指令自定義指令的鉤子函數自定義指令的實例演示 指令注冊局部注冊指令過濾器 數據綁定和響應式原理響應式數據綁定…

Oracle邏輯備份

邏輯備份 expdp 備份恢復表空間 創建測試數據 # 創建表空間 create tablespace itpux01 datafile /oradata/fghsdb/itpux01.dbf size 100m autoextend off extent management local autoallocate segment space management auto; create tablespace itpux02 datafile /o…