stack堆棧簡介
??? 堆棧是一個線性表,插入和刪除只在表的一端進行。這一端稱為棧頂(Stack Top),另一端則為棧底(Stack Bottom)。堆棧的元素插入稱為入棧,元素的刪除稱為出棧。由于元素的入棧和出棧總在棧頂進行,因此,堆棧是一個后進先出(Last In First Out)表,即 LIFO 表。
?? ?C++ STL 的堆棧泛化是直接通過現有的序列容器來實現的,默認使用雙端隊列deque的數據結構,當然,可以采用其他線性結構(vector 或 list等),只要提供堆棧的入棧、出棧、棧頂元素訪問和判斷是否為空的操作即可。由于堆棧的底層使用的是其他容器,因此,堆棧可看做是一種適配器,將一種容器轉換為另一種容器(堆棧容器)。
?? ?為了嚴格遵循堆棧的數據后進先出原則,stack 不提供元素的任何迭代器操作,因此,stack 容器也就不會向外部提供可用的前向或反向迭代器類型。
?? ?stack堆棧容器的C++標準頭文件為 stack ,必須用宏語句 "#include <stack>" 包含進來,才可對 stack 堆棧的程序進行編譯。
???
創建 stack 對象
使用堆棧前,先要利用構造函數進行初始化,創建一個堆棧對象,以進行元素的入棧、出棧等操作。
1.?? ?stack()
?? ?默認構造函數,創建一個空的 stack 對象。
?? ?例如,下面一行代碼使用默認的 deque 為底層容器,創建一個空的堆棧對象 s 。
?? ?stack<int>? s;
?? ?
2.?? ?stack(const stack&)
?? ?復制構造函數,用一個 stack 堆棧創建一個新的堆棧。
?? ?例如,下面的代碼利用 s1 ,創建一個以雙向鏈表為底層容器的空堆棧對象 s2 。
?? ?// stack<int, list<int> >?? s1;
?? ?stack<int, list<int> >?? s2(s1);
?? ?
元素入棧
?? ?stack堆棧容器的元素入棧函數為 push 函數。由于 C++ STL 的堆棧函數是不預設大小的,因此,入棧函數就不考慮堆棧空間是否為滿,均將元素壓入堆棧,從而函數沒有標明入棧成功與否的返回值。
?? ?如下是他的使用原型:
?? ?void? push(const value_type& x)
?? ?
?? ?
元素出棧
?? ?stack容器的元素出棧函數為 pop 函數,由于函數并沒有判斷堆棧是否為空,才進行元素的彈出,因此,需要自行判斷堆棧是否為空,才可執行 pop 函數。
?? ?void pop()
?? ?
?? ?下面的示例代碼,將堆棧的所有元素全部出棧
?? ?// stack<int>? s;
?? ?while(!s.empty())
?? ?{?
?? ??? ?s.pop();// 出棧
?? ?}
?? ?
?? ?
取棧頂元素
?? ?stack容器的棧頂元素的讀取函數為 pop 函數,將取出最后入棧的元素,如下是它的使用原型
?? ?value_type&? top()
堆棧非空判斷
?? ?隨著堆棧元素不斷出棧,堆棧可能會出現空的情況,因此,一般需要調用 empty 函數判斷是否非空,才作元素出棧和取棧頂元素的操作。
?? ?bool? empty()
?? ?判斷堆棧是否為空,返回 true 表示堆棧已空,false 表示堆棧非空。