學習C 自適應容器(棧和佇列)

2021-10-02 18:10:11 字數 3151 閱讀 4153

前言

標準模板庫(stl)提供了一些容器(比如stack、queue、priority_queue),使用這些容器來模擬棧和佇列的行為。

這種內部使用一種容器但呈現另一種容器的行為特徵稱為自適應容器。

棧和佇列與陣列或list非常相似,但是對插入、訪問和刪除元素的方式有一定的限制。可將元素插入到什麼位置以及可以從什麼位置刪除元素決定了容器的行為特徵。

:棧是先進後出系統,只能從棧頂插入或者刪除元素。

佇列:佇列是先進先出系統,元素被插入到隊尾,從隊頭刪除,最先插入的元素最先刪除。可將佇列視為在電影院排隊買票的人,先加入佇列的人先離開。

泛型stl容器std::stack模擬了棧的這種行為。要使用stack,必須包含標頭檔案:

#include

stl stack 是乙個模板類。允許在頂部插入和刪除元素,而不允許訪問中間的元素。

在stl實現中,std::stack的定義如下:

templateclass stack;

引數elementtype是stack儲存的物件型別

第二個模板引數container是stack使用的預設底層容器實現類。預設是使用std::deque來儲存資料,但可以指定使用vector或list來儲存資料。

例項化stack

建立用於儲存double型別的元素的棧:

stack stackdoubles;

建立儲存類(如tuna)物件的棧:

stack stacktunas;

建立儲存double型別元素,並且使用vector作為底層容器的棧:

stack::stackdoublesinvector;

使用乙個stack物件的拷貝來建立另乙個stack物件:

stack stackintscopy(stackints);

stack的成員函式

stack改變了另一種容器(如deque、list或vector)的行為,通過限制元素插入或刪除的方式實現其功能,從而提供嚴格遵守棧機制的行為特徵。

1.push

stackints.push(25); //在棧頂插入元素

2.pop

stackints.pop(); //刪除棧頂的元素

3.empty

if(stackints.empty()) //判斷棧是否為空

4.size

size_t nnum=stackints.size(); //返回棧中的元素數

5.top

stackints.top(); //獲得指向棧頂元素的引用

stl queue是乙個模板類。只允許在末尾插入元素以及從開頭刪除元素;queue不允許訪問中間的元素,但可以訪問開頭和末尾的元素。

泛型stl容器std::queue模擬了佇列的這種行為。要使用queue,必須包含標頭檔案:

#include

std::queue的定義如下:

templateclass queue;

第乙個引數elementtype,是queue物件包含的元素的型別。

第二個引數container,是用於儲存其資料的集合的型別。預設情況下為deque,也可設定為list或vector。

例項化queue

建立儲存型別為int的佇列:

queue qintegers;

建立儲存元素型別為double,且使用std::list儲存這些元素:

queue qdoublesinlist;

使用乙個queue例項化另乙個queue:

queue qcopy(qintegers);

queue的成員函式

1.push

qintegers.push(25); //在隊尾插入乙個元素

2.pop

qintegers.pop(); //將隊首的元素刪除

3.front

qintegers.front(); //返回指向隊首的引用

4.back

qintegers.back(); //返回指向隊尾的引用

5.empty

if(qintegers.empty()){} //檢查佇列是否為空

6.size

size_t nnum=qintegers.size(); //返回佇列的元素數

stl priority_queue 是乙個模板類,使用它,也必須包含標頭檔案:

#include

priority_queue與queue的不同之處在於,包含最大值的元素位於隊首(預設情況下),且只能在隊首執行操作。

例項化

std::priority_queue類的定義如下:

templateclass priority_queue

第三個引數compare指定乙個二元謂詞。預設使用std::less,從大到小排序,即隊首為最大值。使用greater從小到大排序。

例項化乙個整型的優先順序佇列:

priority_queue pqintegers;

建立乙個元素型別為double,且按從小到大的順序儲存在std::deque中的優先順序佇列:

priority_queue pqintegers_inverse;

使用乙個priority_queue來例項化另乙個priority_queue:

pqintegers pqcopy(pqintegers);

priority_queue的成員函式

1.push

pqintegers.push(10); //在優先佇列中插入乙個元素

2.pop

pqintegers.pop(); //刪除隊首元素,即最大的元素

3.top

pqintegers.top(); //返回佇列中隊首元素的引用(即最大的元素)

4.empty

if(pqintegers.empty()){} //檢查是否為空

5.size

pqintegers.size(); // 返回優先佇列中的元素個數

C 棧和佇列 stack堆疊容器

棧 stack 在電腦科學中是限定僅在表尾進行插入或刪除操作的線性表。棧是一種資料結構,它按照後進先出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料。棧是只能在某一端插入和刪除的特殊線性表。用桶堆積物品,先堆進來的壓在底下,隨後一件一件往上堆。取走時,只...

棧和佇列學習

棧的定義 棧是限定只在表尾進行插入和刪除操作的線性表。理解棧的定義的注意點 1 首先它是乙個線性表,棧元素具有線性關係,即前驅後繼關係。2 它的特殊之處在於限制了這個線性表的插入和刪除位置,它始終只在棧頂進行。3 棧的插入操作,叫做進棧。4 棧的刪除操作,叫做出棧。棧和普通線性表的不同點 棧是特殊的...

c 棧和佇列

c 棧 include using std stack s.empty 如果棧為空返回1,否則返回0 s.size 返回棧中元素的個數 s.pop 刪除棧頂元素但不返回其值 s.top 返回棧頂的元素,但不刪除該元素 s.push 在棧頂壓入新元素 測試例項 include include usin...