在 C++ 中使用 STL 堆疊容器

Jinku Hu 2023年1月30日 2021年6月28日
  1. 使用 std::stack 在 C++ 中宣告堆疊容器物件
  2. 使用 top() 函式訪問 C++ 中最近新增的元素
  3. 在 C++ 中使用 swap() 函式交換兩個堆疊的內容
在 C++ 中使用 STL 堆疊容器

本文將演示如何在 C++ 中使用 STL stack 容器的多種方法。

使用 std::stack 在 C++ 中宣告堆疊容器物件

std::stack 被稱為容器介面卡,它可以充當標準容器的包裝器,但提供有限和專門的功能。例如,std::stack 類提供 LIFO(後進先出)資料結構,它可以對映到下面的 std::vectorstd::deque 容器。std::stack 可以用另一個 stack 物件或相容的序列容器(如 dequevectorlist)初始化。但是請注意,用於儲存 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;
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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