介紹完了list類的相關(guān)內(nèi)容后:C++初階:適合新手的手撕list(模擬實(shí)現(xiàn)list)
接下來進(jìn)入新的篇章,stack和queue的介紹以及模擬:
1.stack的初步介紹
stack是一種容器適配器,專門用在具有后進(jìn)先出操作的上下文環(huán)境中,其刪除只能從容器的一端進(jìn)行元素的插入與提取操作。
stack是作為容器適配器被實(shí)現(xiàn)的,容器適配器即是對特定類封裝作為其底層的容器,并提供一組特定的成員函數(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。
2.stack的使用
函數(shù) | 說明 |
---|---|
stack() | 構(gòu)造空的棧 |
empty() | 檢測stack是否為空 |
size() | 返回stack中元素的個數(shù) |
top() | 返回棧頂元素的引用 |
push() | 將元素val壓入stack中 |
pop() | 將stack中尾部的元素彈出 |
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> st;//一個空棧
st.push(1);
st.push(2);
st.push(3);//push進(jìn)去3個
while (!st.empty())//當(dāng)st不空進(jìn)循環(huán)
{
cout << st.top() << endl;//輸出棧頂元素
st.pop();//棧頂出棧
}//遍歷結(jié)束
}
3.queue的初步介紹
隊列是一種容器適配器,專門用于在FIFO上下文(先進(jìn)先出)中操作,其中從容器一端插入元素,另一端提取元素。
隊列作為容器適配器實(shí)現(xiàn),容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的成員函數(shù)來訪問其元素。元素從隊尾入隊列,從隊頭出隊列。
底層容器可以是標(biāo)準(zhǔn)容器類模板之一,也可以是其他專門設(shè)計的容器類。該底層容器應(yīng)至少支持以下操作:
- empty:檢測隊列是否為空
- size:返回隊列中有效元素的個數(shù)
- front:返回隊頭元素的引用
- back:返回隊尾元素的引用
- push_back:在隊列尾部入隊列
- pop_front:在隊列頭部出隊列
- 標(biāo)準(zhǔn)容器類deque和list滿足了這些要求。默認(rèn)情況下,如果沒有為queue實(shí)例化指定容器類,則使用標(biāo)準(zhǔn)容器deque。
4.queue的使用
函數(shù) | 說明 |
---|---|
queue() | 構(gòu)造空的隊列 |
empty() | 檢測隊列是否為空,是返回true,否則返回false |
size() | 返回隊列中有效元素的個數(shù) |
front() | 返回隊頭元素的引用 |
back() | 返回隊尾元素的引用 |
push() | 在隊尾將元素val入隊列 |
pop() | 將隊頭元素出隊列 |
#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int> q;//一個空隊列
q.push(1);
q.push(2);
q.push(3);//push進(jìn)去3個
while (!q.empty())//當(dāng)q不空進(jìn)循環(huán)
{
cout << q.front() << endl;//輸出隊頭元素
q.pop();//出隊
}//遍歷結(jié)束
return 0;
}
5.容器適配器
5.1含義
容器適配器是一種將現(xiàn)有的容器類型適配為不同接口的容器的工具。C++標(biāo)準(zhǔn)庫提供了三種主要的容器適配器:棧(stack)、隊列(queue)和優(yōu)先隊列(priority_queue)。這些適配器都是基于現(xiàn)有的序列容器(如vector、deque或list)實(shí)現(xiàn)的,但提供了不同的接口和行為。
- 棧(stack):棧是一種后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),它只允許在棧頂進(jìn)行插入和刪除操作。在C++中,棧適配器基于deque或vector實(shí)現(xiàn),提供了push、pop、top等操作。
- 隊列(queue):隊列是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),它允許在隊列的前端進(jìn)行刪除操作,在隊列的后端進(jìn)行插入操作。在C++中,隊列適配器也基于deque或list實(shí)現(xiàn),提供了push、pop、front、back等操作。
- 優(yōu)先隊列(priority_queue):優(yōu)先隊列是一種特殊的隊列,它根據(jù)元素的優(yōu)先級進(jìn)行排序。在C++中,優(yōu)先隊列適配器基于vector實(shí)現(xiàn),提供了push、pop、top等操作。
今天先來模擬棧和隊列。優(yōu)先隊列,下次單獨(dú)細(xì)講
怎么理解“適配為不同接口的容器”:
容器適配器(上述三種)提供的操作接口與底層容器的操作接口不同。雖然容器適配器底層使用了常見的序列容器(如vector、deque或list)來存儲數(shù)據(jù),但是它們暴露的操作接口與這些底層容器不同。
舉個例子,讓我們比較一下棧(stack)適配器和vector容器的接口:
- 棧(stack)適配器的接口:
- push:將元素壓入棧頂
- pop:彈出棧頂元素
- top:訪問棧頂元素
- vector容器的接口:
- push_back:在vector的末尾插入元素
- pop_back:刪除vector的末尾元素
- back:訪問vector的末尾元素
如你所見,盡管棧適配器的底層容器可能是vector,但它提供了與vector不同的操作接口。棧適配器隱藏了vector的細(xì)節(jié),只暴露了棧的相關(guān)操作,使得我們可以更方便地使用棧這種數(shù)據(jù)結(jié)構(gòu)。
5.2STL標(biāo)準(zhǔn)庫中stack和queue的底層結(jié)構(gòu)
雖然stack和queue中也可以存放元素,但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器適配器,這是因?yàn)閟tack和隊列只是對其他容器的接口進(jìn)行了包裝,STL中stack和queue默認(rèn)使用deque,比如:
6.模擬stack和queue
文件規(guī)劃和一覽
stack.h:用來實(shí)現(xiàn)stack
queue.h:用來實(shí)現(xiàn)queue
test.cpp:進(jìn)行測試
6.1模擬stack(stack.h)
#pragma once
namespace MyStack
{
template<class T, class Container = deque<T>>
class stack
{
public:
//構(gòu)造函數(shù)、析構(gòu)函數(shù)之類的會去調(diào)用傳過來的的類的
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_front();
}
const T& top()
{
return _con.front();
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
Container _con;//封裝這個類型
};
}
6.2模擬queue(queue.h)
#pragma once
namespace MyQueue
{
template<class T, class Container = deque<T>>
class queue
{
public:
//構(gòu)造函數(shù)、析構(gòu)函數(shù)之類的會去調(diào)用傳過來的的類的
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_front();
}
const T& front()
{
return _con.front();
}
const T& back()
{
return _con.back();
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
Container _con;//封裝這個類型
};
}
文章來源:http://www.zghlxwxcb.cn/news/detail-826615.html
好啦大家,這次就到這里啦!!下次就帶來優(yōu)先級隊列priority_queue
的介紹和模擬。感謝大家文章來源地址http://www.zghlxwxcb.cn/news/detail-826615.html
到了這里,關(guān)于C++初階:容器適配器介紹、stack和queue常用接口詳解及模擬實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!