stack堆疊容器 轉)

2021-07-27 08:37:43 字數 2549 閱讀 1142

堆疊是乙個線性表,插入和刪除只在表的一端進行。這一端稱為棧頂(stack top),另一端則為棧底(stack bottom)。堆疊的元素插入稱為入棧,元素的刪除稱為出棧。由於元素的入棧和出棧總在棧頂進行,因此,堆疊是乙個後進先出(last in first out)表,即 lifo 表。

c++ stl 的堆疊泛化是直接通過現有的序列容器來實現的,預設使用雙端佇列deque的資料結構,當然,可以採用其他線性結構(vector 或 list等),只要提供堆疊的入棧、出棧、棧頂元素訪問和判斷是否為空的操作即可。由於堆疊的底層使用的是其他容器,因此,堆疊可看做是一種介面卡,將一種容器轉換為另一種容器(堆疊容器)。

為了嚴格遵循堆疊的資料後進先出原則,stack 不提供元素的任何迭代器操作,因此,stack 容器也就不會向外部提供可用的前向或反向迭代器型別。

stack堆疊容器的c++標準標頭檔案為 stack ,必須用巨集語句 "#include " 包含進來,才可對 stack 堆疊的程式進行編譯。

建立 stack 物件

使用堆疊前,先要利用建構函式進行初始化,建立乙個堆疊物件,以進行元素的入棧、出棧等操作。

1.    stack()

預設建構函式,建立乙個空的 stack 物件。

例如,下面一行**使用預設的 deque 為底層容器,建立乙個空的堆疊物件 s 。

stacks;

2.    stack(const stack&)

複製建構函式,用乙個 stack 堆疊建立乙個新的堆疊。

例如,下面的**利用 s1 ,建立乙個以雙向鍊錶為底層容器的空堆疊物件 s2 。

// stack>   s1;

stack>   s2(s1);

元素入棧

stack堆疊容器的元素入棧函式為 push 函式。由於 c++ stl 的堆疊函式是不預設大小的,因此,入棧函式就不考慮堆疊空間是否為滿,均將元素壓入堆疊,從而函式沒有標明入棧成功與否的返回值。

如下是他的使用原型:

void  push(const value_type& x)

元素出棧

stack容器的元素出棧函式為 pop 函式,由於函式並沒有判斷堆疊是否為空,才進行元素的彈出,因此,需要自行判斷堆疊是否為空,才可執行 pop 函式。

void pop()

下面的示例**,將堆疊的所有元素全部出棧

// stacks;

while(!s.empty())

取棧頂元素

stack容器的棧頂元素的讀取函式為 pop 函式,將取出最後入棧的元素,如下是它的使用原型

value_type&  top()

堆疊非空判斷

隨著堆疊元素不斷出棧,堆疊可能會出現空的情況,因此,一般需要呼叫 empty 函式判斷是否非空,才作元素出棧和取棧頂元素的操作。

bool  empty()

判斷堆疊是否為空,返回 true 表示堆疊已空,false 表示堆疊非空。

1

//----------------------------------------- 讀取堆疊的棧頂元素

2 #include 3 #include 4

using

namespace

std;

5int

main()625

26return0;

27 }

1

/*堆疊的大小

2堆疊的元素個數可用 size 函式獲得。每次元素入棧前,先檢查當前堆疊的大小,超過某個界限值,則不允許元素入棧,以此可實現乙個具有一定容量限制的堆疊。

3size_type size()

4返回當前堆疊的元素個數56

下面的示例程式,將堆疊的大小設定為 100 個 int 元素,而且使用 list 雙向鍊錶做堆疊的底層容器,每次壓入元素時均判斷堆疊的大小是否超過100個元素的界限,從而實現具有容量限制的堆疊。7*/

89 -----------------------------------------限制堆疊的大小

10 #include 11 #include 12 #include 13

#define stack_size 100 //

堆疊最大容量

14using

namespace

std;

15int

main()

1633

34return0;

35 }

----------------------- stack 小結

堆疊是一種應用非常廣泛的資料結構。c++ stl 將這種資料結構和它若干受限制操作用泛型類 stack 容器封裝出來,包括堆疊初始化、元素入棧、取棧頂元素、元素出棧、判斷堆疊是否非空和取得當前堆疊大小等,應用起來十分容易。

stack的元素出棧操作是不返回棧頂元素的,需要另外通過取棧頂函式獲得。這種分離實現是考慮到出棧函式若直接返回棧頂元素,將會導致返回值的資料引用安全問題或不必要的低效複製函式的呼叫。

從 stack 內部實現看,stack 堆疊是不設最大容量的,但可通過 size 函式獲取當前堆疊的大小,以判斷是否允許繼續讓元素入棧,實現具有最大容量限制的堆疊。

stack堆疊容器

堆疊是一種線性表,插入和刪除操作只在表的一端進行,該端成為棧頂,另一端則稱為棧底。元素的入棧和出棧都是在棧頂進行的,因此堆疊是一種後進先出表 lifo c stl 的堆疊泛化是通過現有的序列容器來實現的,預設使用的是雙端佇列 deque 的資料結構。在 stl中,stack 的元素出棧操作是不返回棧...

stack堆疊容器

stack堆疊容器 堆疊是乙個線性表,插入和刪除只在表的一端進行。這一端稱為棧頂 stack top 另一端則為棧底 stack bottom 堆疊的元素插入稱為入棧,元素的刪除稱為出棧。由於元素的入棧和出棧總在棧頂進行,因此,堆疊是乙個後進先出 last in first out 表,即 lifo...

stack堆疊容器

stack堆疊是乙個後進先出 last in first out,lifo 的線性表,插入和刪除元素都只能在表的一端進行。插入元素的一段稱為棧頂 stack top 而另一端則稱為棧底 stack bottom 插入元素叫入棧 push 元素的刪除稱為出棧 pop 下面是棧的示意圖 要使用stack...