C 容器簡介1 stack

2021-09-27 08:34:56 字數 3715 閱讀 9437

**

引用鏈結

stack是一種容器介面卡(stl的容器分為順序容器和關聯容器,容器介面卡),被設計來用於操作先進後出(filo)結構的情景,在這種情況下, 元素的插入和刪除都只能在容器的尾部進行。

stack通過容器介面卡來實現,是一種將特定的容器類作為其最底層的容器的類,它提供了一些特定的成員函式來訪問自己的元素,元素只能在這個特定容器的後面,也就是棧的頂部,進行出棧和入棧操作。

最底層的容器可以是任意一種標準的容器模板類,或者是一些有明確目的的容器類,他們應該支援以下操作:

empty(判斷是否為空)

size (返回棧的元素個數)

back (返回棧頂元素)

push (入棧)

pop(出棧)

標準的容器類,比如vector,deque,list,滿足以上需求。如果沒有明確指定需要使用的容器,預設情況下將會使用deque。

#include using namespace std;

#include void main01() //棧模型

cout << "棧的大小: " << s.size() << endl;

while (!s.empty()) //出棧

cout << endl;

}class teacher

};void main02() //結構體

}void main03() //結構體指標

}void main()

1、empty()

返回當前棧是否為空(當它的大小是0的時候),empty()函式並不能清空棧,只是乙個返回bool型的const函式。
stacks;

s.push(1);

s.push(2);

cout << s.empty() << endl; //輸出0

2、size()

返回容器中元素的個數,時間複雜度o(1),返回值型別是size_type,也就是unsigned int。size()函式不能改變棧的大小。

例如上面的**段應該輸出 2

3、top()

返回棧頂元素的引用。

由於棧是一種先進後出的結構,所以最頂部的元素就是最後插入棧的元素。

(c++11中會自動根據元素型別返回reference或者是const_reference,對乙個空的棧呼叫top函式,會異常終止,所以應該使用empty()函式提前檢查)

stacks;

s.push(1);

s.push(2);

cout << s.top() << endl; //輸出2

s.top() += 3; //引用可以作為左值

cout << s.top() << endl; //輸出5

4、push() 和 emplace() (c++11)

push()函式和emplace()都是在棧這個容器的頂部插入乙個新的元素。

push(),實際上是呼叫的底層容器的push_back()函式,新元素的值是push函式引數的乙個拷貝。

emplace(),實際上是呼叫的底層容器的emplace_back()函式,新元素的值是在容器內部就地構造的,不需要移動或者拷貝。

stack的emplace也可以用在普通的基本型別上。

struct node

int x;

};int main()

5、pop()

刪除最頂部的元素,使棧的大小減小。

這個被刪除的元素,是剛剛插入棧的元素,這個元素和top函式的返回值是一致的。這個函式會呼叫物件的析構函式(如果有的話),pop()實際上是用過底層容器的pop_back()函式實現的。

對乙個空棧進行pop(),會導致程式異常終止,應該使用empty提前檢查

stacks;

s.push(1);

s.push(2);

s.push(3);

cout << s.top() << endl; //3

s.pop();

cout << s.top() << endl; //2

棧沒有clear或者erase函式,如果想要清空乙個棧,需要迴圈的呼叫出棧函式。

stacks;

//error

//error

s.push(1);

s.push(2);

s.push(3);

cout << s.size() << endl; //3

while(!s.empty())

s.pop();

cout << s.size() << endl; //0

6、swap()

交換兩個棧的內容(所有元素),這個函式通過非成員函式swap()來交換底層容器,時間複雜度o(1)

// stack::swap

#include using namespace std;

#include int main ()

7、運算子過載

比較:先大小,後元素

(1) ==

template bool operator== (const stack& lhs, const stack& rhs);

(2) 過載 !=

template bool operator!= (const stack& lhs, const stack& rhs);

(3) 過載 <

template bool operator< (const stack& lhs, const stack& rhs);

(4) 過載 <=

template bool operator<= (const stack& lhs, const stack& rhs);

(5) 過載 >

template bool operator> (const stack& lhs, const stack& rhs);

(6) 過載 >=

template bool operator>= (const stack& lhs, const stack& rhs);

例子 stackl1;

l1.emplace(1);

l1.emplace(2);

l1.emplace(3);

stackl2;

l2.emplace(1);

l2.emplace(2);

cout << boolalpha << (l1 > l2) << endl; //t

cout << boolalpha << (l1 == l2) << endl; //f

cout << boolalpha << (l1 != l2) << endl; //t

STL略談 1 stack實現

最近幾天在看 stl原始碼,個人感覺如果不自己實現下 stl簡單的架構是很難對 stl有乙個比較系統的了解。所以在閱讀的同時,自己也開始寫寫原始碼。一開始從 list 容器入手,因為之前對 list 有一定的了解,實現起來也比較輕鬆。但是涉及到迭代器等資料結構的時候,很難將其與 list 聯絡起來。...

STL學習 入門(1) stack

include stack template classt,class container deque t class stack 棧 stack 是乙個容器介面卡 container adaptor 型別,被特別設計用來執行於lifo last in first out 場景,在該場景中,只能從容...

我的C 實踐 1 Stack的實現

1 基本的stack 以std deque為內部容器。方法有入棧 出棧 返回棧頂元 判斷棧空。測試程式 2 改進1 指定棧的容量,要用到非型別模板引數。由於棧的容量固定,可以用陣列來存放元素。測試程式 3 改進2 可以指定棧內部使用的容器,還可以使 不同型別的棧之間能賦值。要用到模板模板引數。要定義...