所屬專欄:C“嘎嘎" 系統(tǒng)學(xué)習(xí)??
?? >博主首頁(yè):初陽(yáng)785??
?? >代碼托管:chuyang785??
?? >感謝大家的支持,您的點(diǎn)贊和關(guān)注是對(duì)我最大的支持?。。??
?? >博主也會(huì)更加的努力,創(chuàng)作出更優(yōu)質(zhì)的博文!!??
1. stack,queue的介紹與使用
1.1stack的介紹
stack的文檔介紹
- stack是一種容器適配器,專門用在具有后進(jìn)先出操作的上下文環(huán)境中,其刪除只能從容器的一端進(jìn)行
元素的插入與提取操作。 - stack是作為容器適配器被實(shí)現(xiàn)的,容器適配器即是對(duì)特定類封裝作為其底層的容器,并提供一組特定
的成員函數(shù)來訪問其元素,將特定類作為其底層的,元素特定容器的尾部(即棧頂)被壓入和彈出。 - stack的底層容器可以是任何標(biāo)準(zhǔn)的容器類模板或者一些其他特定的容器類,這些容器類應(yīng)該支持以下
操作:
empty:判空操作
back:獲取尾部元素操作
push_back:尾部插入元素操作
pop_back:尾部刪除元素操作 - 標(biāo)準(zhǔn)容器vector、deque、list均符合這些需求,默認(rèn)情況下,如果沒有為stack指定特定的底層容器,
默認(rèn)情況下使用deque。
1.2stack的使用
函數(shù)說明 | 接口說明 |
---|---|
stack() | 構(gòu)造空的棧 |
empty() | 檢測(cè)stack是否為空 |
size() | 返回stack中元素的個(gè)數(shù) |
top() | 返回棧頂元素的引用 |
push() | 將元素val壓入stack中 |
pop() | 將stack中尾部的元素彈出 |
1.3queue的介紹
queue的文檔介紹文章來源:http://www.zghlxwxcb.cn/news/detail-834138.html
- 隊(duì)列是一種容器適配器,專門用于在FIFO上下文(先進(jìn)先出)中操作,其中從容器一端插入元素,另一端
提取元素。 - 隊(duì)列作為容器適配器實(shí)現(xiàn),容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的
成員函數(shù)來訪問其元素。元素從隊(duì)尾入隊(duì)列,從隊(duì)頭出隊(duì)列。 - 底層容器可以是標(biāo)準(zhǔn)容器類模板之一,也可以是其他專門設(shè)計(jì)的容器類。該底層容器應(yīng)至少支持以下操
作:
empty:檢測(cè)隊(duì)列是否為空
size:返回隊(duì)列中有效元素的個(gè)數(shù)
front:返回隊(duì)頭元素的引用
back:返回隊(duì)尾元素的引用
push_back:在隊(duì)列尾部入隊(duì)列
pop_front:在隊(duì)列頭部出隊(duì)列 - 標(biāo)準(zhǔn)容器類deque和list滿足了這些要求。默認(rèn)情況下,如果沒有為queue實(shí)例化指定容器類,則使用標(biāo)
準(zhǔn)容器deque。
1.4queue的使用
函數(shù)聲明 | 接口說明 |
---|---|
queue() | 構(gòu)造空的隊(duì)列 |
empty() | 檢測(cè)隊(duì)列是否為空,是返回true,否則返回false |
size() | 返回隊(duì)列中有效元素的個(gè)數(shù) |
front() | 返回隊(duì)頭元素的引用 |
back() | 返回隊(duì)尾元素的引用 |
push() | 在隊(duì)尾將元素val入隊(duì)列 |
pop() | 將隊(duì)頭元素出隊(duì)列 |
2.stack,queue的模擬實(shí)現(xiàn)
適配器:
適配器是一種設(shè)計(jì)模式(設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總
結(jié)),該種模式是將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口
用簡(jiǎn)單話來概括適配器就是——用現(xiàn)有的東西適配出一個(gè)新的東西。文章來源地址http://www.zghlxwxcb.cn/news/detail-834138.html
2.1stack的模擬是實(shí)現(xiàn)
- 補(bǔ)充知識(shí)點(diǎn):
我們知道函數(shù)傳參的時(shí)候是可以有缺省參數(shù)并給定默認(rèn)參數(shù)值的,所以我們的類模板參數(shù)同樣是可以的。 - 既然是利用現(xiàn)有的東西適配出一個(gè)新的東西,用來適配的STL就需要可以滿足被適配出來的所屬功能。這里stack棧要實(shí)現(xiàn)的是fist in last out先進(jìn)后出的功能,也就是push_back和pop_back這兩個(gè)主要的功能,所以只要可以滿足這兩個(gè)主要的功能,基本上可以用來適配出stack容器了。
- 既然是適配,我們的類模板參數(shù)就需要傳遞一個(gè)STL容器的類型過來,用來適配,所以就需要一個(gè)Container參數(shù)類型用來接收用來適配的容器的類型,并在內(nèi)用這個(gè)類型創(chuàng)建對(duì)象,并用這個(gè)對(duì)象來實(shí)現(xiàn)所需要的功能。
- 這里用到的默認(rèn)適配器是deque雙端隊(duì)列,這個(gè)在后期的章節(jié)會(huì)進(jìn)行講解,這里就簡(jiǎn)單的理解一下,deque是兼容了vector和list的所用功能,可以理解是vector和list的結(jié)合體。
#pragma once
#include <deque>
namespace qfw
{
template< class T, class Container = deque<T>>
class stack
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
T& top()
{
return _con.back();
}
const T& top() const
{
return _con.back();
}
size_t size() const
{
return _con.size();
}
bool empty() const
{
return _con.empty();
}
private:
Container _con;
};
}
2.2queue的模擬實(shí)現(xiàn)
#pragma once
#include <deque>
namespace qfw
{
template <class T, class Container = deque<T>>
class queue
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_front();
}
T& back()
{
return _con.back();
}
const T& back()const
{
return _con.back();
}
T& front()
{
return _con.front();
}
const T& front() const
{
return _con.front();
}
size_t size() const
{
return _con.size();
}
bool empty() const
{
return _con.empty();
}
private:
Container _con;
};
}
3.總結(jié)
- 本章節(jié)的主要核心點(diǎn)是適配器的使用,有了適配器大大代碼的冗余性,大大提高了代碼的復(fù)用性,并且使得我們的代碼結(jié)構(gòu)變得多樣性。只要使用的適配器可以滿足我們所需要的功能就可以進(jìn)行適配。比如stack我們不僅可以用deque進(jìn)行適配,也可以用vector和list進(jìn)行適配,不同的適配器,使用不同的結(jié)構(gòu),但是都可以得到我們想要的結(jié)果,當(dāng)然這是在有類模板的前提下。
- 所以其實(shí)繞個(gè)彎過來核心還是模板的使用,模板的使用讓代碼程序變得更加的靈活多變,減少了很多程序員的代碼成本,但是編譯器底層還是會(huì)將模板展開并進(jìn)行一次類型匹配,也就是將原本我們的工作量交給了編譯器幫我們做了。
到了這里,關(guān)于STL之stack+queue的使用及其實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!