STL概覽——棧( stack )、隊列( queue )和優先級隊列( priority_queue)

棧(stack)

 ?stack是一種先進后出(First In Last Out,FILO)的數據結構,它只有一個口,平常在我們寫深度優先遍歷算法時,,就會用到棧,stack允許我們增加,移除,取得最頂端元素。但是除了最頂端元素之外,沒有任何其他方法可以存取stack的其它元素,因此stack不允許有遍歷行為。

  以某種既有容器為底層結構,將其接口改變,使之符合 “先進后出” 的特性,形成一個 stack ,是很容易做到的。deque 是雙向開口的數據結構,若以 deque為底部結構并封閉其頭部端口,便輕而易舉形成一個 stack 。因此,SGI STL 便以 deque 作為缺省情況下的 stack 底部結構。

  

template <class _Tp, class _Sequence>
class stack {
public:typedef typename _Sequence::value_type      value_type;typedef typename _Sequence::size_type       size_type;typedef          _Sequence                  container_type;typedef typename _Sequence::reference       reference;typedef typename _Sequence::const_reference const_reference;
protected:_Sequence c;                                //底層容器
public:stack() : c() {}explicit stack(const _Sequence& __s) : c(__s) {}//以下完全利用_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(); }//末端進,末端出void push(const value_type& __x) { c.push_back(__x); }void pop() { c.pop_back(); }
};

?

  stack 因為所有元素都必須遵守“先進后出”的條件,只有 stack 頂端的元素,才有機會被外界取用,stack 不提供走訪功能,因此沒有迭代器。

  當然還可以以 list 作為 stack 底層容器:

  

#include <iostream>
#include <string>
#include <stack>
#include <list>
using namespace std;
int main()
{  //用雙向鏈表作為底層容器
    stack<int, list<int> > temp;for(int i = 0; i < 10; i++){temp.push(i);                //0 1 2 3 4 5 6 7 8 9
    }for(int i = 0; i < 10; i++){printf("%d ", temp.top());    //9 8 7 6 5 4 3 2 1 0 
        temp.pop();}return 0;
}

隊列(stack)

  queue是一種先進先出(First In First Out,FIFO)的數據結構,它有兩個出口,queue 允許新增元素,移除元素,從最低端加入元素,取得最頂端元素。但除了最底端可以加入,最頂端可以取出外,沒有其他任何方法可以存取 queue 的其他元素,因此 queue 不允許有遍歷行為,也就是沒有迭代器。同棧一樣,STL里面默認 deque 作為缺省情況下的 queue 底部結構:

  

template <class _Tp, class _Sequence>
class queue {public:typedef typename _Sequence::value_type      value_type;typedef typename _Sequence::size_type       size_type;typedef          _Sequence                  container_type;typedef typename _Sequence::reference       reference;typedef typename _Sequence::const_reference const_reference;
protected:_Sequence c;                                //底層容器
public:queue() : c() {}explicit queue(const _Sequence& __c) : c(__c) {}//以下完全利用 Sequence c 的操作完成queue操作bool empty() const { return c.empty(); }size_type size() const { return c.size(); }reference front() { return c.front(); }const_reference front() const { return c.front(); }reference back() { return c.back(); }const_reference back() const { return c.back(); }void push(const value_type& __x) { c.push_back(__x); }void pop() { c.pop_front(); }
};

?

優先級隊列(priority_queue)

  priority_queue 是一種具有權值觀念的 queue,他允許加入新元素,移除舊元素,審視元素值等功能,同樣只支持底部加元素,頂端取元素,除此以外別無其他存取元素途徑。但priority_queue 其內部的元素并非按照被推入的次序排列,而是自動依照元素的權值排列,權值越高,排在越前面。缺省情況下,priority_queue 利用max-heap 完成,后者是一個以vector表現的 complete binary tree。max-heap 可以滿足 priority_queue 所需要的 “權值從高到低自動地減排序” 的特性。

template <class _Tp, class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(vector<_Tp>),class _Compare__STL_DEPENDENT_DEFAULT_TMPL(less<typename _Sequence::value_type>) >
class priority_queue {public:typedef typename _Sequence::value_type      value_type;typedef typename _Sequence::size_type       size_type;typedef          _Sequence                  container_type;typedef typename _Sequence::reference       reference;typedef typename _Sequence::const_reference const_reference;
protected:_Sequence c;                    //底層容器_Compare comp;                    //排序規則
public:priority_queue() : c() {}explicit priority_queue(const _Compare& __x) :  c(), comp(__x) {}//以下用到的 make_heap(), push_heap() 和 pop_heap()都是泛型算法//任何一個構造函數都在底層產生一個 implicit representation heap (隱式表述堆)priority_queue(const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { make_heap(c.begin(), c.end(), comp); }#ifdef __STL_MEMBER_TEMPLATEStemplate <class _InputIterator>priority_queue(_InputIterator __first, _InputIterator __last) : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }template <class _InputIterator>priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x): c(__first, __last), comp(__x) { make_heap(c.begin(), c.end(), comp); }template <class _InputIterator>priority_queue(_InputIterator __first, _InputIterator __last,const _Compare& __x, const _Sequence& __s): c(__s), comp(__x){ c.insert(c.end(), __first, __last);make_heap(c.begin(), c.end(), comp);}#else /* __STL_MEMBER_TEMPLATES */priority_queue(const value_type* __first, const value_type* __last) : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }priority_queue(const value_type* __first, const value_type* __last, const _Compare& __x) : c(__first, __last), comp(__x){ make_heap(c.begin(), c.end(), comp); }priority_queue(const value_type* __first, const value_type* __last, const _Compare& __x, const _Sequence& __c): c(__c), comp(__x) { c.insert(c.end(), __first, __last);make_heap(c.begin(), c.end(), comp);}#endif /* __STL_MEMBER_TEMPLATES */bool empty() const { return c.empty(); }size_type size() const { return c.size(); }const_reference top() const { return c.front(); }void push(const value_type& __x) {//push_heap()是泛型算法,先利用底層的push_back() 將新元素推入末端,再重排heap
        __STL_TRY{c.push_back(__x); push_heap(c.begin(), c.end(), comp);}__STL_UNWIND(c.clear());}void pop(){//pop_heap()是泛型算法,從 heap 內取出一個元素,它并不是真正將元素彈出//而是重排 heap, 然后以底層容器的 pop_back() 取得被彈出的元素  
        __STL_TRY {pop_heap(c.begin(), c.end(), comp);c.pop_back();}__STL_UNWIND(c.clear());}
};

?

  priority_queue 的所有元素進出都有一定規則,只有 queue 頂端的元素,也就是權值最高者,才有機會被外界取用,priority_queue沒有迭代器。

  priority_queue 測試如下:

  

#include <iostream>
#include <string>
#include <queue>
#include <list>
using namespace std;
int main()
{int a[] = {0, 1,12,5,56,3,23,16}; priority_queue<int> temp(a, a + 8);cout << "top element: " << temp.top() << endl;    //56
    cout << "output from top: ";int pd_size = temp.size();for(int i = 0; i < pd_size; i++){cout << temp.top() <<" ";            //56 23 16 12 5 3 1 0
        temp.pop();}return 0;
}

  stack , queue , priority_queue 都是以底部容器完成其所有工作,而這些具有 “修改某物接口,形成另一種風貌” 的性質的數據結構, 成為adapter(配接器),?stack , queue , priority_queue 都是容器的配接器。

?

轉載于:https://www.cnblogs.com/Forever-Road/p/6897487.html

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

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

相關文章

使用JMeter對異步HTTP / REST服務進行壓力/負載測試

盡管我一直在使用JMeter進行Web應用程序的壓力測試和負載測試好幾次&#xff0c;但我們還是花了一些時間才弄清楚如何使用該工具測試基于異步HTTP / REST的服務。 在我們這里&#xff0c;我是指一名程序員&#xff0c; Holger Staudacher &#xff0c;我很榮幸能與當前的一個項…

轉義字符的使用和功能python_Python中轉義符和格式符的混合使用,python,轉義字符,與,格式化...

# coding: utf-8 mon 麻辣小龍蝦 #周一麻辣小龍蝦 tue 宮保雞丁 #周二宮保雞丁 wed 水煮肉片 #周三水煮肉片 thu 果兒拌菜 #周四果兒拌菜 fri 小雞燉蘑菇 #小雞燉蘑菇 Cf_price 23 #麻辣小龍蝦價格 CK_price 12 #宮保雞丁價格 BM_price 32 #水煮肉片價格 MV_price 19 …

mock接口開發,excel(讀,寫,修改)

mock接口開發 首先需要安裝 Flask 模塊 &#xff1a;pip install flask 然后引用 from flask import request #想獲取到請求參數的話&#xff0c;就得用這個 lanxia flask.Flask(__name__) #把這個python文件當做一個web服務 lanxia.server(/login,[ post , get ] )#第…

web前端學習之ruby標記和rt/rp標記

ruby 標記定義ruby注釋&#xff08;中文注音或字符&#xff09;。ruby標記與rt標記一同使用。ruby標記由一個或多個字符&#xff08;需要一個解釋/發音&#xff09;和一個提供該信息的rt 標記組成&#xff0c;還包括可選的rp標記&#xff0c;定義當瀏覽器不支持ruby 標記時顯示…

mysql 5.7 udf http_mysql下mysql-udf-http效率測試小記

看到張宴的博客上關于"http/rest客戶端的文章"&#xff0c;怎樣安裝啥的直接都跳過&#xff0c;下面直接進入測試階段&#xff0c;測試環境&#xff1a;虛擬機復制代碼 代碼如下:[rootlocalhost ~]# uname -aLinux sunss 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 …

作為一名程序員,聊聊我們的現狀和未來

前言&#xff1a;互聯網這個高速發展的新興行業&#xff0c;注定是敢想敢干敢創新&#xff0c;耐勞耐操耐折騰年輕人的天下&#xff1f; 我們所在的互聯網行業&#xff0c;不斷地有新的公司冒出&#xff0c;有新的商業模式成形&#xff0c;有新的產品形態影響著大家的生活日常&…

適用于孩子,父母和祖父母的JBoss HornetQ –第1章

現在與HornetQ合作已經快4年了&#xff0c;我認為是時候分享我到目前為止所學知識的一部分了。 這篇文章的主要目的不是重寫官方文檔 &#xff0c;而是以簡單的方式闡明我們在PaddyPower中最常用的概念。 什么是HornetQ HornetQ是JMS實現。 JMS是一種面向消息的中間件API&am…

riot.js教程【四】Mixins、HTML內嵌表達式

前文回顧riot.js教程【三】訪問DOM元素、使用jquery、mount輸入參數、riotjs標簽的生命周期&#xff1b;riot.js教程【二】組件撰寫準則、預處理器、標簽樣式和裝配方法&#xff1b;riot.js教程【一】簡介&#xff1b; 共享Mixins 混合開發可以使你很好的復用代碼&#xff0c;如…

移動端判斷手機橫豎屏狀態

禁用用戶自動縮放功能&#xff1a; <meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0"> 判斷橫豎屏狀態有兩種方法&#xff1a;css判斷、js判斷 (一)、css判斷橫屏還是豎屏 1、寫在同一個css文…

ubuntu dhcp ping 不通 自己_??2、DHCP安裝和配置

DHCP動態主機設置協議&#xff0c;是一個局域網的網絡協議&#xff0c;使用UDP協議工作&#xff0c;可以快速分配IP地址&#xff0c;解決內網IP不足、手動配置IP造成IP沖突以及內網機器多手工配置比較麻煩的問題。1.把win2008和win2003設置同一網段&#xff0c;網絡適配器—配置…

python秒數變日期_將pandas日期列轉換為已用秒數

新答案 將文本轉換為Timedeltadf[Origin Time(Local)] pd.to_timedelta(df[Origin Time(Local)]) df[Seconds] df[Origin Time(Local)].dt.total_seconds() 舊答案 考慮數據幀dfdf pd.DataFrame(dict(Datepd.date_range(2017-03-01, 2017-03-02, freq2H))) Date 0 2017-03-0…

mysql用一個表更新另一個表的方法

Solution 1: 修改1列(navicate可行) update student s, city c set s.city_name c.name where s.city_code c.code; Solution 2: 修改多個列 update a, b set a.titleb.title, a.nameb.name where a.idb.id Solution 3: 采用子查詢(navicate不可行) update student s set…

選擇您的Java EE 6應用服務器

我被問到的第一個問題是&#xff1a;“我們應該使用哪個Java EE應用服務器&#xff1f;”。 隨著Java EE 6的日益普及&#xff0c;新的兼容應用程序服務器獲得了認證。 當前的官方兼容性和認證矩陣列出了針對完全配置文件&#xff0c;Web配置文件或兩者認證的12種不同產品。 如…

串的基本計算

#include<stdio.h> #include<stdlib.h> //typedef int Status; #define Max 20 #define OK 1 #define ERROR 0 #define OVERLOE -2 typedef struct//堆分配表示串 { char *ch; int length; }HString; // int CreatHString(HString &H)//構造字符串 { H.length …

HTML表格屬性及簡單實例

這里主要總結記錄下表格的一些屬性和簡單的樣式&#xff0c;方便以后不時之需。 1、<table> 用來定義HTML的表格&#xff0c;具有本地屬性 border 表示邊框&#xff0c;border屬性的值必須為1或空字符串("")。該屬性不會控制邊框的樣式&#xff0c;而是由CSS來…

怎么查看MySQL 源碼編譯了什么_Mysql 源碼編譯教程貼

題外話:這是一篇教程貼,不僅學的是mysql的編譯,還是一些編譯的知識.我也是一個菜鳥,寫一些感悟和心得,有什么問題可以批評指正,謝謝!如果只是為了安裝請移到我的另一篇安裝貼: Mysql安裝貼環境:OS: CentOS 6.6x64 minimysql: mysql-5.6.251. mysql 下載:http://dev.mysql.com/d…

linux mysql啟動_MySQL 安裝(二)

MySQL 安裝所有平臺的Mysql下載地址為&#xff1a;MySQL 下載 . 挑選你需要的 MySQL Community Server 版本及對應的平臺。Linux/UNIX上安裝MySQLLinux平臺上推薦使用RPM包來安裝MySQL&#xff0c;MySQL AB提供了以下RPM包的下載地址&#xff1a;MySQL - MySQL服務器。你需要該…

0524駝峰命名法,模態對話框

模態對話框 window.showModalDialog("url"&#xff0c;"向目標對話框傳的值"&#xff0c;"窗口特征參數") 打開模態對話框 模態對話框必須關掉才能對后端操作。 模塊對話框和窗口的區別是永遠置頂。 特征參數&#xff1a;用分號隔開&#xff0c;…

誰在偷你的記憶? 應用服務器版

您創建了一個了不起的應用程序。 您將其投入生產。 您會發現您沒有足夠的可用內存。 即使您的所有測量結果&#xff08;可能是借助我們的小型公用事業公司進行的測量 &#xff09;都表明您應該還不錯。 我們計劃發布一系列博客文章&#xff0c;研究堆消失的位置&#xff0c;并…

遺忘的html標簽

1 <span>x</span><sup>2</sup><span> y10</span> 2 <br> 3 <span>H</span><sub>2</sub><span>O</span> <sup> 標簽可定義上標文本。 包含在 <sup> 標簽和其結束標簽 …