C++에서 STL 스택 컨테이너 사용

Jinku Hu 2023년10월12일
  1. std::stack을 사용하여 C++에서 스택 컨테이너 객체 선언
  2. top()함수를 사용하여 C++에서 가장 최근에 추가 된 요소에 액세스
  3. swap()함수를 사용하여 C++에서 두 스택의 내용 교환
C++에서 STL 스택 컨테이너 사용

이 기사는 C++에서 STL stack컨테이너를 사용하는 방법에 대한 여러 방법을 보여줍니다.

std::stack을 사용하여 C++에서 스택 컨테이너 객체 선언

‘std::stack’은 표준 컨테이너의 래퍼 역할을 할 수 있지만 제한적이고 특수한 기능을 제공하는 컨테이너 어댑터라고합니다. 예를 들어,std::stack 클래스는 LIFO (last-in, firs-out) 데이터 구조를 제공하며 그 아래에있는std::vector 또는std::deque 컨테이너에 매핑 될 수 있습니다. std::stack은 다른stack 객체 또는deque,vectorlist와 같은 호환 가능한 시퀀스 컨테이너로 초기화 할 수 있습니다. 하지만 ‘stack’요소를 저장하는 데 사용되는 기본 컨테이너는 ‘deque’입니다. 또한 이니셜 라이저 목록 또는 요소를 직접 전달하는 것을 지원하는 생성자가 없습니다. stack 객체가 선언되면push 메소드를 사용해야합니다.

stack객체는 범위 기반 루프를 사용하여 반복 할 수 없습니다. 따라서 각 요소를cout스트림에 인쇄하기 위해 특별한while루프를 구현합니다. 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

swap()함수를 사용하여 C++에서 두 스택의 내용 교환

swap()함수는stack컨테이너의 멤버 함수입니다. stack오브젝트에 대한 참조를 취하고 이러한 스택에서 요소를 교환합니다. vector객체를 사용하여 초기화 된st1객체는swap함수를 호출하거나 함수에 대한 인수가 될 수 없습니다. 컨테이너 초기화stackswap함수와 함께 사용하려면st3객체가 다음 코드 예제에서 초기화되므로std::move호출을 사용하여 생성해야합니다. 후자는 문제없이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

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 Facebook