日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器

發(fā)布時(shí)間:2023/12/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • Stack是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),他只有一個(gè)出口
  • stack允許 新增元素、移除元素、取得最頂端的元素,但是無(wú)法獲得stack的內(nèi)部數(shù)據(jù),因此satck沒(méi)有遍歷行為

?Stack定義的完整列表 (雙端隊(duì)列作為Stack的底層容器)

  • 將deque作為Stack的底部結(jié)構(gòu),對(duì)其原有的接口進(jìn)行適配,使其滿足"先進(jìn)后出"的特性
  • deque是雙向開(kāi)口的數(shù)據(jù)結(jié)構(gòu),只需要封閉deque的頭端開(kāi)口(缺省實(shí)現(xiàn)),便輕而易舉的形成了一個(gè)stack。
  • Stack基于deque,這種“修改某物的接口 形成另外一種事物的”的性質(zhì)歸結(jié)為 adapter (配接器),因此將stack不歸類為容器,而將其歸結(jié)為 container adapter (容器適配器)
  • 先前自己寫的 STL版的 deque 缺失的代碼比較多,因此下面的代碼中?class Sequence = std::deque<T> 借用STL標(biāo)準(zhǔn)庫(kù)的deque實(shí)現(xiàn)
//定義在stl_config.h文件中 //但是沒(méi)有找到 具體詳情參見(jiàn) 參考鏈接 # ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS # define __STL_NULL_TMPL_ARGS <> # else # define __STL_NULL_TMPL_ARGS # endiftemplate <class T,class Sequence = std::deque<T>> class stack{//__STL_NULL_TMPL_ARGS會(huì)展開(kāi)為 <> friend bool operator== __STL_NULL_TMPL_ARGS(const stack&,const stack&);friend bool operator< __STL_NULL_TMPL_ARGS(const stack&,const stack&); public:typedef typename Sequence::value_type value_type;typedef typename Sequence::size_type size_type;typedef typename Sequence::reference reference;typedef typename Sequence::const_reference const_reference; protected://底層容器Sequence c; public://以下完全使用Sequence c的操作,完成stack的操作bool empty() const {return c.empty();}size_type size() const {return c.size();}reference top() {return c.back();}const_reference top() const {return c.back();}//deque 是兩頭可以進(jìn)出,stack是末端進(jìn),末端出 (所以后進(jìn)者先出)void push(const value_type& x){ c.push_back(x);}void pop(){return c.pop_back();} };template <class T,class Sequence> bool operator==(const stack<T,Sequence>&x,const stack<T,Sequence>&y){return x.c == y.c; }template <class T,class Sequence> bool operator<(const stack<T,Sequence>&x,const stack<T,Sequence>&y){return x.c < y.c; }

Stack沒(méi)有迭代器

  • 考慮到只有stack的頂端的元素才會(huì)被外界取用,因此 stack不需要提供遍歷元素的迭代器

基于底層容器鏈表list的Stack

  • Stack需要的函數(shù)如 empty、size()、back、push_back、pop_back是鏈表也支持的
  • 使用范例
#include <stack> #include <list> #include <iostream> #include <algorithm>int main(){std::stack<int,std::list<int>>list_stack;list_stack.push(1);list_stack.push(3);list_stack.push(5);list_stack.push(7);std::cout << list_stack.size() << std::endl; //4std::cout << list_stack.top() << std::endl; //7list_stack.pop();std::cout << list_stack.top() << std::endl; //5list_stack.pop();std::cout << list_stack.top() << std::endl; //3list_stack.pop();std::cout << list_stack.top() << std::endl; //1std::cout << list_stack.size() << std::endl; //1 }

參考鏈接

  • 【c++從菜雞到王者】第六篇:詳解晦澀難懂的c++語(yǔ)法_Sefr后端-CSDN博客
  • SGI STL-----__STL_NULL_TMPL_ARGS_yde的博客-CSDN博客
  • 《STL源碼剖析》-- stl_config.h_一個(gè)人的戰(zhàn)爭(zhēng)-CSDN博客

總結(jié)

以上是生活随笔為你收集整理的STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。