1. 程式人生 > >c++ stl棧容器stack用法介紹

c++ stl棧容器stack用法介紹

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 表示堆疊非空。




c++ stl棧stack介紹


C++ Stack(堆疊) 是一個容器類的改編,為程式設計師提供了堆疊的全部功能,——也就是說實現了一個先進後出(FILO)的資料結構。

c++ stl棧stack的標頭檔案為

#include <stack> 

c++ stl棧stack的成員函式介紹

操作 比較和分配堆疊

empty() 堆疊為空則返回真

pop() 移除棧頂元素

push() 在棧頂增加元素

size() 返回棧中元素數目

top() 返回棧頂元素

//----------------------------------------- 讀取堆疊的棧頂元素
#include <stack>
#include <iostream>
using namespace std;
int main()
{
    // 建立堆疊物件
    stack<int> s;
    // 元素入棧
    s.push(3);
    s.push(19);
    s.push(23);
    s.push(36);
    s.push(50);
    s.push(4);
 
    // 元素依次出棧
    while(!s.empty())
    {
        // 列印棧頂元素,打印出:4 50 36 23 19 3
        cout << s.top() << endl;
        // 出棧
        s.pop();
    }
 
    return 0;
}
/*    堆疊的大小
    堆疊的元素個數可用 size 函式獲得。每次元素入棧前,先檢查當前堆疊的大小,超過某個界限值,則不允許元素入棧,以此可實現一個具有一定容量限制的堆疊。
    size_type  size()
    返回當前堆疊的元素個數
    
    下面的示例程式,將堆疊的大小設定為 100 個 int 元素,而且使用 list 雙向連結串列做堆疊的底層容器,每次壓入元素時均判斷堆疊的大小是否超過100個元素的界限,從而實現具有容量限制的堆疊。
*/
----------------------------------------- 限制堆疊的大小
#include <stack>
#include <list>
#include <iostream>
#define STACK_SIZE  100   // 堆疊最大容量
using namespace std;
int main()
{
    // 用雙向連結串列作堆疊的底層結構
    stack<int, list<int> >   s; 
    // 堆疊未滿,元素才能入棧
    if (s.size() < STACK_SIZE)
        s.push(68);
    if (s.size() < STACK_SIZE)
        s.push(1);
    if (s.size() < STACK_SIZE)
        s.push(17);
    // 元素出棧
    while (!s.empty())
    {
        // 列印 17 1 68
        cout << s.top() << endl;
        s.pop();
    }
 
    return 0;
}

----------------------- stack 小結
    堆疊是一種應用非常廣泛的資料結構。C++ STL 將這種資料結構和它若干受限制操作用泛型類 stack 容器封裝出來,包括堆疊初始化、元素入棧、取棧頂元素、元素出棧、判斷堆疊是否非空和取得當前堆疊大小等,應用起來十分容易。
    stack的元素出棧操作是不返回棧頂元素的,需要另外通過取棧頂函式獲得。這種分離實現是考慮到出棧函式若直接返回棧頂元素,將會導致返回值的資料引用安全問題或不必要的低效複製函式的呼叫。
    
    從 stack 內部實現看,stack 堆疊是不設最大容量的,但可通過 size 函式獲取當前堆疊的大小,以判斷是否允許繼續讓元素入棧,實現具有最大容量限制的堆疊。