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

Jinku Hu 2023年10月12日
  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 <deque>
#include <iostream>
#include <stack>
#include <vector>

using std::cout;
using std::deque;
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() {
  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;
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook