c++中的stack和dequeue解析
stack介紹
首先stack是一個(gè)類這個(gè)類是專門用來存數(shù)據(jù),并且這個(gè)類是一個(gè)模板類,所以我們可以使用這個(gè)stack來存儲(chǔ)各種各樣的數(shù)據(jù),但是這個(gè)類在存儲(chǔ)數(shù)據(jù)的時(shí)候得遵循LIFO規(guī)則也就是后進(jìn)先出原則:后進(jìn)入stack的數(shù)據(jù)會(huì)先出stack,我們把最后進(jìn)入stack對(duì)象的數(shù)據(jù)稱為棧頂元素,把最先進(jìn)入stack對(duì)象的數(shù)據(jù)稱為棧底元素,下面是這個(gè)類的英文介紹:
stack的定義
我們來看看stack的構(gòu)造函數(shù):
庫中的stack函數(shù)只提供了一種形式,并且這種形式的參數(shù)只有一個(gè)還提供了缺省值,那么我們?cè)谑褂眠@個(gè)類的時(shí)候就不要管這個(gè)參數(shù)直接使用缺省值即可,比如下面的代碼:
#include<iostream> #include<stack> using namespace std; int main() { stack<int> s1; return 0; }
這樣我們就創(chuàng)建了一個(gè)空類。
stack的數(shù)據(jù)插入
在stack中插入數(shù)據(jù)只能用到push函數(shù):
這個(gè)函數(shù)有一個(gè)參數(shù),并且該參數(shù)是value_type類型,那么這個(gè)類型的意思是:模板中第一個(gè)參數(shù)的類型
也就是stack在顯示初始化的時(shí)候我們給的那個(gè)類型,那么該函數(shù)的使用代碼如下:
#include<iostream> #include<stack> using namespace std; int main() { stack<int> s1; s1.push(1); s1.push(2); s1.push(3); s1.push(4); return 0; }
我們可以通過調(diào)試看到這里的s1中確實(shí)有數(shù)據(jù)1 2 3 4 :
stack中數(shù)據(jù)的個(gè)數(shù)
這個(gè)函數(shù)就是顯示stack對(duì)象中含有數(shù)據(jù)的個(gè)數(shù)
比如下面的代碼:
int main() { stack<int> s1; s1.push(1); s1.push(2); s1.push(3); s1.push(4); size_t _size = s1.size(); cout << "對(duì)象中還有的個(gè)數(shù)為:" << _size << endl; return 0; }
這段代碼的運(yùn)行結(jié)果為:
stack數(shù)據(jù)刪除
在stack當(dāng)中不存在頭刪尾刪和任意位置的刪除,只有一個(gè)pop函數(shù)來刪除數(shù)據(jù)最后進(jìn)入stack對(duì)象的數(shù)據(jù),也就是棧頂元素:
比如說下面的代碼:
int main() { stack<int> s1; s1.push(1); s1.push(2); s1.push(3); s1.push(4); size_t _size = s1.size(); cout << "對(duì)象中還有的個(gè)數(shù)為:" << _size << endl; s1.pop(); return 0; }
我們通過調(diào)試可以看到在pop函數(shù)執(zhí)行之前對(duì)象s1中的內(nèi)容為:
當(dāng)我們執(zhí)行完這里的pop函數(shù)之后,由于元素4是最后一個(gè)進(jìn)入stack對(duì)象的,所以它是棧頂元素,那么在執(zhí)行完pop函數(shù)之后該元素就會(huì)被刪除,我們來看看調(diào)試的結(jié)果:
那么這就是pop函數(shù)的作用。
stack中數(shù)據(jù)的查看
在stack當(dāng)中沒有迭代器,范圍for和操作符[ ]重載這些功能,因?yàn)閟tack遵守后進(jìn)先出的LIFO規(guī)則,所以我們這里只能通過top函數(shù)來查看stack對(duì)象中的棧頂元素的內(nèi)容,
當(dāng)我們想看棧頂?shù)暮笠粋€(gè)元素的時(shí)候,就只能將棧頂?shù)脑貏h除再調(diào)用top函數(shù)來進(jìn)行查看,比如說下面的代碼:
int main() { stack<int> s1; s1.push(1); s1.push(2); s1.push(3); s1.push(4); size_t _size = s1.size(); cout << "對(duì)象中還有的個(gè)數(shù)為:" << _size << endl; cout << "對(duì)象中棧頂?shù)脑貫椋? << s1.top() << endl; s1.pop(); _size = s1.size(); cout << "對(duì)象中還有的個(gè)數(shù)為:" << _size << endl; cout << "現(xiàn)在棧頂?shù)脑貫椋? << s1.top() << endl; return 0; }
這段代碼的運(yùn)行結(jié)果如下:
并且我們還可以通過top函數(shù)來修改棧頂元素的內(nèi)容,比如說下面的代碼:
int main() { stack<int>s1; s1.push(1); s1.push(2); s1.push(3); s1.push(4); cout << "修改前棧頂?shù)脑貫椋? << s1.top() << endl; s1.top() = 10; cout << "修改后棧頂?shù)脑貫椋? << s1.top() << endl; }
這段代碼的運(yùn)行結(jié)果如下:
判斷stack對(duì)象是否為空
當(dāng)我們想看看stack對(duì)象是否為空的時(shí)候就可以用到empty函數(shù),這個(gè)函數(shù)的功能就是檢查對(duì)象的數(shù)據(jù)是否為空,如果為空的話這個(gè)函數(shù)就會(huì)返回true,如果不為空的話這個(gè)函數(shù)就會(huì)返回flase,該函數(shù)的介紹如下:
這里就不用演示了。
stack對(duì)象的數(shù)據(jù)交換
stack也提供了,swap函數(shù)其作用就是將兩個(gè)stack對(duì)象的數(shù)據(jù)進(jìn)行交換,該函數(shù)的介紹如下:
我們可以看看下面的代碼:
int main() { stack<int> s1; s1.push(1); s1.push(2); s1.push(3); s1.push(4); stack<int> s2; s2.push(5); s2.push(6); s2.push(7); s2.push(8); s1.swap(s2); return 0; }
在執(zhí)行swap函數(shù)之前兩個(gè)對(duì)象的內(nèi)容如下:
執(zhí)行完swap函數(shù)之后兩個(gè)對(duì)象的內(nèi)容為:
那么以上就是stack庫中的所有基本內(nèi)容。
queue的介紹
隊(duì)列是一種容器適配器,專門用于在FIFO上下文(先進(jìn)先出)中操作,其中從容器一端插入元素,另一端提取元素。隊(duì)列作為容器適配器實(shí)現(xiàn),容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的成員函數(shù)來訪問其元素。元素從隊(duì)尾入隊(duì)列,從隊(duì)頭出隊(duì)列。底層容器可以是標(biāo)準(zhǔn)容器類模板之一,也可以是其他專門設(shè)計(jì)的容器類。標(biāo)準(zhǔn)容器類deque和list滿足了這些要求。默認(rèn)情況下,如果沒有為queue實(shí)例化指定容器類,則使用標(biāo)準(zhǔn)容器deque。
queue的定義
這個(gè)對(duì)象的構(gòu)造函數(shù)也只有一個(gè)參數(shù),并且這個(gè)參數(shù)也是提供了缺省參數(shù),我們使用的時(shí)候可以不用管,我們使用的時(shí)候直接創(chuàng)建一個(gè)空隊(duì)列就行:
#include<iostream> #include<queue> using namespace std; int main() { queue<int> q1; return 0; }
queue的數(shù)據(jù)插入
通過這個(gè)函數(shù),我們可以往指定隊(duì)列對(duì)象中插入數(shù)據(jù),那么這里的參數(shù)類型得和隊(duì)列的數(shù)據(jù)相同,我們可以看卡下面的代碼:
#include<iostream> #include<queue> using namespace std; int main() { queue<int> q1; q1.push(1); q1.push(2); q1.push(3); q1.push(4); return 0; }
我們創(chuàng)建隊(duì)列的時(shí)候顯示初始化為int類型,那么我們使用push函數(shù)的時(shí)候也得傳遞int類型的數(shù)據(jù),那么我們這里就可以通過調(diào)試來看到這個(gè)對(duì)象的中內(nèi)容:
front
這個(gè)函數(shù)的作用就是返回隊(duì)列頭部的值,并且我們可以通過這個(gè)函數(shù)來修改隊(duì)列頭部的值,比如說下面的代碼:
using namespace std; int main() { queue<int> q1; q1.push(1); q1.push(2); q1.push(3); q1.push(4); cout <<"front 指向的元素為:" << q1.front() << endl; q1.front() = 10; cout << "front 指向的元素為:" << q1.front() << endl; return 0; }
這段代碼的運(yùn)行結(jié)果如下:
back
這個(gè)函數(shù)的作用與front函數(shù)相反,這個(gè)函數(shù)就是返回隊(duì)列尾部的值并且同樣可以對(duì)其進(jìn)行修改,比如說下面的代碼:
int main() { queue<int> q1; q1.push(1); q1.push(2); q1.push(3); q1.push(4); cout << "back 指向的元素為:" << q1.back() << endl; q1.back() = 10; cout << "back 指向的元素為:" << q1.back() << endl; return 0; }
queue的元素個(gè)數(shù)
size函數(shù)的作用就是返回隊(duì)列中元素的個(gè)數(shù),比如說下面的代碼:
int main() { queue<int> q1; q1.push(1); q1.push(2); q1.push(3); q1.push(4); cout << "q1的元素個(gè)數(shù)為:" << q1.size() << endl; q1.push(5); cout << "q1的元素個(gè)數(shù)為:" << q1.size() << endl; return 0; }
這段代碼的運(yùn)行結(jié)果如下:
queue中元素的刪除
在隊(duì)列中刪除元素得用到pop函數(shù),這個(gè)函數(shù)可以將隊(duì)列中隊(duì)頭的數(shù)據(jù)進(jìn)行刪除,比如說下面的代碼:
int main() { queue<int> q1; q1.push(1); q1.push(2); q1.push(3); q1.push(4); cout << "q1的元素個(gè)數(shù)為:" << q1.size() << endl; q1.pop(); cout << "q1的元素個(gè)數(shù)為:" << q1.size() << endl; return 0; }
這段代碼的運(yùn)行結(jié)果如下:
empty
當(dāng)我們想看看queue對(duì)象是否為空的時(shí)候就可以用到empty函數(shù),這個(gè)函數(shù)的功能就是檢查對(duì)象的內(nèi)容是否為空,如果為空的話這個(gè)函數(shù)就會(huì)返回true,如果不為空的話這個(gè)函數(shù)就會(huì)返回flase。
queue的數(shù)據(jù)交換
如果我們想將兩個(gè)queue對(duì)象的數(shù)據(jù)進(jìn)行交換的話,我們這里就可以使用swap函數(shù),這里為了防止使用者用錯(cuò)了方法,庫中還提供了另外一種使用的形式:
我們來看看下面的代碼:
int main() { queue<int> q1; q1.push(1); q1.push(2); q1.push(3); q1.push(4); queue<int> q2; q2.push(5); q2.push(6); q2.push(7); q2.push(8); q1.swap(q2); swap(q1, q2); return 0; }
我們可以通過調(diào)試來看到在swap函數(shù)執(zhí)行之前兩個(gè)對(duì)象的內(nèi)容為:
執(zhí)行了第一個(gè)swap函數(shù)之后,兩個(gè)對(duì)象的內(nèi)容進(jìn)行了交換:
當(dāng)我們?cè)賵?zhí)行另一種swap函數(shù)之后對(duì)象的數(shù)據(jù)如下:
那么這就是swap函數(shù)的作用。
到此這篇關(guān)于c++中的stack和dequeue介紹的文章就介紹到這了,更多相關(guān)c++ stack和dequeue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++中stack、queue、vector的用法詳解
- C++ STL容器stack和queue詳解
- c++中stack、queue和vector的基本操作示例
- C++線程安全容器stack和queue的使用詳細(xì)介紹
- C++?超詳細(xì)講解stack與queue的使用
- C++ stack與queue模擬實(shí)現(xiàn)詳解
- C++ 詳細(xì)講解stack與queue的模擬實(shí)現(xiàn)
- C++ stack與queue使用方法詳細(xì)講解
- 深入探索C++中stack和queue的底層實(shí)現(xiàn)
- 圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)
相關(guān)文章
wchar_t,char,string,wstring之間的相互轉(zhuǎn)換
以下是對(duì)wchar_t,char,string,wstring之間的相互轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-09-09QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序
這篇文章主要為大家詳細(xì)介紹了QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08MATLAB Delaunay算法提取離散點(diǎn)邊界的方法
這篇文章主要為大家詳細(xì)介紹了MATLAB Delaunay算法提取離散點(diǎn)邊界的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12boost.asio框架系列之調(diào)度器io_service
這篇文章介紹了boost.asio框架系列之調(diào)度器io_service,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C語言中隨機(jī)數(shù)rand()函數(shù)詳解
大家好,本篇文章主要講的是C語言中隨機(jī)數(shù)rand()函數(shù)詳解,感興趣的同學(xué)感快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02簡(jiǎn)要介紹C++編程中的友元函數(shù)和友元類
這篇文章主要介紹了C++編程中的友元函數(shù)和友元類,屬于較為冷僻的知識(shí),在實(shí)際開發(fā)中較少使用,需要的朋友可以參考下2015-09-09C/C++實(shí)現(xiàn)矩陣的轉(zhuǎn)置(示例代碼)
C/C++實(shí)現(xiàn)矩陣的轉(zhuǎn)置(示例代碼)需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-10-10