前言
文章綁定了VS平臺(tái)下std::stack和std::queue的源碼,大家可以下載了解一下??
前面我們講了C語(yǔ)言的基礎(chǔ)知識(shí),也了解了一些數(shù)據(jù)結(jié)構(gòu),并且講了有關(guān)C++的命名空間的一些知識(shí)點(diǎn)以及關(guān)于C++的缺省參數(shù)、函數(shù)重載,引用 和 內(nèi)聯(lián)函數(shù)也認(rèn)識(shí)了什么是類和對(duì)象以及怎么去new一個(gè) ‘對(duì)象’ ,以及學(xué)習(xí)了幾個(gè)STL的結(jié)構(gòu)也相信大家都掌握的不錯(cuò),接下來(lái)博主將會(huì)帶領(lǐng)大家繼續(xù)學(xué)習(xí)有關(guān)C++比較重要的知識(shí)點(diǎn)—— stack & queue(STL)。下面話不多說(shuō)坐穩(wěn)扶好咱們要開(kāi)車了??
stack
1. stack概念
stack 的文檔介紹
在C++中std::stack
是一個(gè)模板類,它是基于容器的適配器,用于實(shí)現(xiàn)堆棧數(shù)據(jù)結(jié)構(gòu)。堆棧是一種后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),類似于現(xiàn)實(shí)生活中的一疊盤子。std::stack
類位于<stack>
頭文件中,并且是C++標(biāo)準(zhǔn)庫(kù)的一部分。它提供了一組成員函數(shù)和操作符,用于對(duì)堆棧進(jìn)行操作。
2. stack特點(diǎn)
-
后進(jìn)先出(LIFO):
std::stack
是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),這意味著最后壓入堆棧的元素將首先被彈出。 -
基于容器的適配器:
std::stack
是基于容器的適配器,它使用底層容器來(lái)存儲(chǔ)元素。默認(rèn)情況下,std::deque
被用作底層容器,但你也可以選擇其他容器,如std::vector
或std::list
。 -
快速插入和刪除:由于
std::stack
是基于容器的適配器,它使用底層容器的插入和刪除操作來(lái)實(shí)現(xiàn)元素的壓入和彈出。這些操作的時(shí)間復(fù)雜度通常是常數(shù)時(shí)間,因此插入和刪除操作非常高效。 -
無(wú)索引訪問(wèn):
std::stack
不支持通過(guò)索引訪問(wèn)元素。你只能訪問(wèn)堆棧頂部的元素,即使用top()
函數(shù)。如果你需要訪問(wèn)其他位置的元素,你需要先將頂部的元素彈出。 -
無(wú)迭代器支持:
std::stack
不支持迭代器,因此你不能使用迭代器遍歷堆棧中的元素。如果你需要遍歷堆棧中的元素,你需要先將它們彈出。 -
大小可變:
std::stack
的大小是可變的,你可以根據(jù)需要?jiǎng)討B(tài)地壓入和彈出元素。
3. stack使用
- 包含頭文件:首先,你需要包含
<stack>
頭文件,以便使用std::stack
類。
#include <stack>
- 創(chuàng)建堆棧對(duì)象:使用
std::stack
類創(chuàng)建一個(gè)堆棧對(duì)象。你需要指定堆棧中元素的類型。例如,如果你想創(chuàng)建一個(gè)存儲(chǔ)整數(shù)的堆棧,你可以這樣做:
std::stack<int> myStack;
- 壓入元素:使用
push(element)
函數(shù)將元素壓入堆棧的頂部。你可以連續(xù)調(diào)用push()
函數(shù)來(lái)壓入多個(gè)元素。
myStack.push(10);
myStack.push(20);
myStack.push(30);
- 彈出元素:使用
pop()
函數(shù)從堆棧的頂部移除元素。你可以使用循環(huán)或條件語(yǔ)句來(lái)連續(xù)彈出元素。
myStack.pop();
- 訪問(wèn)頂部元素:使用
top()
函數(shù)可以訪問(wèn)堆棧頂部的元素,但不會(huì)將其從堆棧中移除。
int topElement = myStack.top();
- 檢查堆棧是否為空:使用
empty()
函數(shù)可以檢查堆棧是否為空。如果堆棧為空,返回true
;否則返回false
。
if (myStack.empty()) {
// 堆棧為空
} else {
// 堆棧不為空
}
- 獲取堆棧的大?。菏褂?code>size()函數(shù)可以獲取堆棧中元素的數(shù)量。
int stackSize = myStack.size();
這些是使用std::stack
的一般步驟。可以根據(jù)需要進(jìn)行堆棧的操作,如壓入元素、彈出元素、訪問(wèn)頂部元素等。
queue
1. queue概念
queue的文檔介紹
在C++中,queue(隊(duì)列)是一種數(shù)據(jù)結(jié)構(gòu),它遵循先進(jìn)先出(FIFO)的原則。它類似于現(xiàn)實(shí)生活中的排隊(duì),新元素被添加到隊(duì)列的末尾,而從隊(duì)列中移除元素時(shí),總是從隊(duì)列的前端開(kāi)始。
2. queue特點(diǎn)
-
先進(jìn)先出(FIFO):
std::queue
是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),這意味著最先添加到隊(duì)列的元素將首先被移除。 -
基于容器的適配器:
std::queue
是基于容器的適配器,它使用底層容器來(lái)存儲(chǔ)元素。 -
快速插入和刪除:由于
std::queue
是基于容器的適配器,它使用底層容器的插入和刪除操作來(lái)實(shí)現(xiàn)元素的添加和移除。這些操作的時(shí)間復(fù)雜度通常是常數(shù)時(shí)間,因此插入和刪除操作非常高效。 -
無(wú)索引訪問(wèn):
std::queue
不支持通過(guò)索引訪問(wèn)元素。你只能訪問(wèn)隊(duì)列的前端和末尾元素,即使用front()
和back()
函數(shù)。 -
無(wú)迭代器支持:
std::queue
不支持迭代器。如果你需要遍歷隊(duì)列中的元素,你需要先將它們移除。 -
大小可變:
std::queue
的大小是可變的,你可以根據(jù)需要?jiǎng)討B(tài)地添加和移除元素。
3. queue使用
- 包含頭文件:首先,你需要包含
<queue>
頭文件,以便使用std::queue
類。
#include <queue>
- 創(chuàng)建隊(duì)列對(duì)象:使用
std::queue
類創(chuàng)建一個(gè)隊(duì)列對(duì)象。你需要指定隊(duì)列中元素的類型。例如,如果你想創(chuàng)建一個(gè)存儲(chǔ)整數(shù)的隊(duì)列,你可以這樣做:
std::queue<int> myQueue;
- 添加元素:使用
push(element)
函數(shù)將元素添加到隊(duì)列的末尾。你可以連續(xù)調(diào)用push()
函數(shù)來(lái)添加多個(gè)元素。
myQueue.push(10);
myQueue.push(20);
myQueue.push(30);
- 移除元素:使用
pop()
函數(shù)從隊(duì)列的前端移除元素。你可以使用循環(huán)或條件語(yǔ)句來(lái)連續(xù)移除元素。
myQueue.pop();
- 訪問(wèn)前端和末尾元素:使用
front()
函數(shù)可以訪問(wèn)隊(duì)列的前端元素,使用back()
函數(shù)可以訪問(wèn)隊(duì)列的末尾元素,但不會(huì)將它們從隊(duì)列中移除。
int frontElement = myQueue.front();
int backElement = myQueue.back();
- 檢查隊(duì)列是否為空:使用
empty()
函數(shù)可以檢查隊(duì)列是否為空。如果隊(duì)列為空,返回true
;否則返回false
。
if (myQueue.empty()) {
// 隊(duì)列為空
} else {
// 隊(duì)列不為空
}
- 獲取隊(duì)列的大?。菏褂?code>size()函數(shù)可以獲取隊(duì)列中元素的數(shù)量。
int queueSize = myQueue.size();
這些是使用std::queue
的一般步驟??梢愿鶕?jù)需要進(jìn)行隊(duì)列的操作,如添加元素、移除元素、訪問(wèn)前端和末尾元素等。
容器適配器
1. 什么是適配器
適配器是一種設(shè)計(jì)模式,它允許將一個(gè)類的接口轉(zhuǎn)換為另一個(gè)類的接口,以便兩個(gè)類可以協(xié)同工作。適配器模式通常用于解決兩個(gè)不兼容的接口之間的問(wèn)題。
在C++中,適配器也可以指代標(biāo)準(zhǔn)庫(kù)中的容器適配器。容器適配器是一種特殊類型的容器,它使用底層容器來(lái)提供不同的接口和功能。適配器通過(guò)封裝底層容器的操作,提供了一組新的操作和語(yǔ)義。
2. STL標(biāo)準(zhǔn)庫(kù)中stack和queue的底層結(jié)構(gòu)
雖然stack和queue中也可以存放元素,但在STL中并沒(méi)有將其劃分在容器的行列,而是將其稱為容器適配器,這是因?yàn)閟tack和隊(duì)列只是對(duì)其他容器的接口進(jìn)行了包裝,STL標(biāo)準(zhǔn)庫(kù)中std::stack
和std::queue
。它們分別基于底層容器(默認(rèn)為std::deque
)提供了堆棧和隊(duì)列的功能。
3. STL標(biāo)準(zhǔn)庫(kù)中對(duì)于stack和queue的模擬實(shí)現(xiàn)
?stack的模擬實(shí)現(xiàn)
template<class T, class Container = deque<T>>
class stack
{
public:
//入棧
void push(const T& x)
{
_con.push_back(x);
}
//出棧
void pop()
{
_con.pop_back();
}
//返回棧頂數(shù)據(jù)
T& top()
{
return _con.back();
}
//返回const類型棧頂數(shù)據(jù)
const T& top() const
{
return _con.back();
}
//判斷是否為空
bool empty()
{
return _con.empty();
}
//返回棧的大小
size_t size() const
{
return _con.size();
}
private:
Container _con;
};
?stack的模擬實(shí)現(xiàn)
template<class T, class Container = deque<T>>
class queue
{
public:
//進(jìn)入隊(duì)列
void push(const T& x)
{
_con.push_back(x);
} //出隊(duì)列
void pop()
{
_con.pop_front();
}
//返回隊(duì)尾數(shù)據(jù)
T& back()
{
return _con.back();
}
//返回隊(duì)頭數(shù)據(jù)
T& front()
{
return _con.front;
}
//返回const類型隊(duì)尾數(shù)據(jù)
const T& back() const
{
return _con.back();
}
//返回const類型隊(duì)頭數(shù)據(jù)
const T& front() const
{
return _con.front;
}
//判斷是否為空
bool empty() const
{
return _con.empty();
}
//返回隊(duì)列大小
size_t size() const
{
return _con.size();
}
private:
Container _con;
};
總結(jié)
stack是一種后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),它是一種容器適配器。它的特點(diǎn)是最后添加的元素將首先被移除。stack使用底層容器來(lái)存儲(chǔ)元素,默認(rèn)情況下使用std::deque作為底層容器。。queue是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),也是一種容器適配器。它使用底層容器來(lái)存儲(chǔ)元素,默認(rèn)情況下使用std::deque作為底層容器。適配器是一種設(shè)計(jì)模式,它允許將一個(gè)類的接口轉(zhuǎn)換為另一個(gè)類的接口,以便兩個(gè)類可以協(xié)同工作。在STL標(biāo)準(zhǔn)庫(kù)中,stack和queue是基于其他容器實(shí)現(xiàn)的容器適配器。它們使用底層容器來(lái)存儲(chǔ)元素,并提供了堆棧和隊(duì)列的功能。
溫馨提示
感謝您對(duì)博主文章的關(guān)注與支持!在閱讀本篇文章的同時(shí),我們想提醒您留下您寶貴的意見(jiàn)和反饋。如果您喜歡這篇文章,可以點(diǎn)贊、評(píng)論和分享給您的同學(xué),這將對(duì)我提供巨大的鼓勵(lì)和支持。另外,我計(jì)劃在未來(lái)的更新中持續(xù)探討與本文相關(guān)的內(nèi)容。我會(huì)為您帶來(lái)更多關(guān)于C++以及編程技術(shù)問(wèn)題的深入解析、應(yīng)用案例和趣味玩法等。請(qǐng)繼續(xù)關(guān)注博主的更新,不要錯(cuò)過(guò)任何精彩內(nèi)容!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-664363.html
再次感謝您的支持和關(guān)注。我們期待與您建立更緊密的互動(dòng),共同探索C++、算法和編程的奧秘。祝您生活愉快,排便順暢!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-664363.html
到了這里,關(guān)于【C++入門到精通】C++入門 —— 容器適配器、stack和queue(STL)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!