**
引用鏈結
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()函式不能改變棧的大小。3、top()例如上面的**段應該輸出 2
返回棧頂元素的引用。
由於棧是一種先進後出的結構,所以最頂部的元素就是最後插入棧的元素。
(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 可以指定棧內部使用的容器,還可以使 不同型別的棧之間能賦值。要用到模板模板引數。要定義...