在 C++ 中使用 STL 堆疊容器
本文將演示如何在 C++ 中使用 STL stack
容器的多種方法。
使用 std::stack
在 C++ 中宣告堆疊容器物件
std::stack
被稱為容器介面卡,它可以充當標準容器的包裝器,但提供有限和專門的功能。例如,std::stack
類提供 LIFO(後進先出)資料結構,它可以對映到下面的 std::vector
或 std::deque
容器。std::stack
可以用另一個 stack
物件或相容的序列容器(如 deque
、vector
和 list
)初始化。但是請注意,用於儲存 stack
元素的預設容器是 deque
。此外,沒有建構函式支援直接傳遞初始化列表或元素。一旦宣告瞭 stack
物件,我們就需要使用 push
方法。
請注意,無法通過使用基於範圍的迴圈來迭代 stack
物件。因此,我們實現了一個特殊的 while
迴圈來將每個元素列印到 cout
流。printStack
函式接受 stack
引數,但是無法將由 vector
物件初始化的 st1
傳遞給它,因為這兩個物件的型別不同並且編譯器會丟擲錯誤。
#include <iostream>
#include <stack>
#include <vector>
using std::cout; using std::endl;
using std::stack; using std::vector;
template<typename T>
void printStack(stack<T> s) {
while (!s.empty()) {
cout << s.top() << "; ";
s.pop();
}
cout << endl;
}
int main()
{
vector<int> vec1 = { 1, 2, 3, 4, 11 };
stack st1{ vec1 };
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
// printStack(st1); Error - no matching function
printStack(st2);
return EXIT_SUCCESS;
}
使用 top()
函式訪問 C++ 中最近新增的元素
top()
函式是一個成員函式,它返回堆疊中的頂部元素。請注意,此函式不會自動從 stack
物件中刪除返回的元素。應該呼叫 pop
成員函式來刪除它。
#include <iostream>
#include <stack>
using std::cout; using std::endl;
using std::stack;
int main()
{
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
cout << "top of the stack st2: ";
cout << st2.top() << endl;
return EXIT_SUCCESS;
}
輸出:
top of the stack st2: 120
在 C++ 中使用 swap()
函式交換兩個堆疊的內容
swap()
函式是 stack
容器的成員函式。它需要對 stack
物件的引用,並從這些堆疊中交換元素。請注意,使用 vector
物件初始化的 st1
物件不能呼叫 swap
函式或作為它的引數。為了使容器初始化的 stack
能夠與 swap
函式一起使用,需要使用 std::move
呼叫來建立它,因為在以下程式碼示例中初始化了 st3
物件。後者也可以毫無問題地傳遞給 printStack
函式。最後,我們交換 st2
/st3
堆疊物件的元素並將結果列印到控制檯。
#include <iostream>
#include <stack>
#include <vector>
#include <deque>
using std::cout; using std::endl;
using std::stack; using std::vector;
using std::deque;
template<typename T>
void printStack(stack<T> s) {
while (!s.empty()) {
cout << s.top() << "; ";
s.pop();
}
cout << endl;
}
int main()
{
deque<int> deq1 = { 11, 12, 13, 14 };
vector<int> vec1 = { 1, 2, 3, 4, 11 };
stack st1{ vec1 };
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
// st2.swap(st1); Error
stack<int> st3 {std::move(deq1)};
printStack(st2);
printStack(st3);
st2.swap(st3);
printStack(st2);
printStack(st3);
return EXIT_SUCCESS;
}
輸出:
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
14; 13; 12; 11;
14; 13; 12; 11;
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn