쌓다 C++ 예제가 포함된 STL

⚡ 스마트 요약

쌓다 C++ STL은 단일 끝에서 요소를 추가하고 제거하는 LIFO 컨테이너 어댑터를 구현합니다.ping 순서가 지정된 데이터를 관리하기 위한 기본 시퀀스 컨테이너(예: deque, vector 또는 list).

  • 🔘 LIFO 원칙: std::stack은 후입선출(LIFO) 방식을 따르므로 가장 최근에 추가된 요소가 항상 가장 먼저 제거됩니다.
  • 📦 컨테이너 어댑터: 스택은 기존 시퀀스 컨테이너를 래핑하며, 컨테이너 유형이 제공되지 않으면 기본적으로 deque를 사용합니다.
  • 핵심 운영: 푸시, 팝, 탑 기능은 각각 항목을 삽입하고, 맨 위 항목을 제거하고, 맨 위 항목을 읽습니다.
  • 🔍 주정부 수표: empty 및 size 함수는 스택에 요소가 있는지 여부와 현재 저장된 요소의 개수를 보고합니다.
  • 🔁 추가 기능: emplace 및 swap 함수는 요소를 제자리에 생성하고 두 스택의 내용을 교환합니다.
  • 🤖 AI 지원: GitHub Copilot과 같은 AI 코딩 도우미는 짧은 주석에서 스택 푸시, 팝 및 순회 관련 기본 코드를 생성합니다.

쌓다 C++ STL

std::스택이 무엇인가요?

스택은 LIFO(Last In First Out) 기법을 기반으로 작동하는 데이터 구조입니다. std::stack을 사용하면 한쪽 끝에서만 요소를 추가하고 제거할 수 있습니다.

`std::stack` 클래스는 컨테이너 어댑터입니다. 컨테이너 객체는 유사한 데이터 유형의 데이터를 저장합니다. 다양한 시퀀스 컨테이너를 사용하여 스택을 생성할 수 있습니다. 컨테이너가 제공되지 않으면 기본적으로 `deque` 컨테이너가 사용됩니다. 컨테이너 어댑터는 이터레이터를 지원하지 않으므로 데이터를 조작하는 데 사용할 수 없습니다.

스택 구문

스택을 생성하려면 다음을 포함해야 합니다. 우리 코드의 헤더 파일. 그런 다음 이 구문을 사용하여 std::stack을 정의합니다.

template <class Type, class Container = deque<Type> > class stack;
  • 타입 – std::stack에 포함된 요소의 유형입니다. 어떤 것이든 유효할 수 있습니다. C++ 유형 또는 사용자 정의 유형.
  • 컨테이너 – 기본 컨테이너 객체의 유형입니다.

회원 유형

스택 멤버 유형은 다음과 같습니다.

  • 값 유형– 첫 번째 템플릿 매개변수인 T는 요소 유형을 나타냅니다.
  • 컨테이너 유형– 두 번째 템플릿 매개변수인 Container는 기본 컨테이너 유형을 나타냅니다.
  • 크기_유형– 부호 없는 정수형입니다.

Opera스택의 옵션

A C++ 스택은 다음과 같은 기본 작업을 지원합니다.

  • 푸시 스택에 항목을 추가/밀어넣습니다.
  • 대중적인 스택에서 항목을 제거/팝합니다.
  • 몰래 엿보다 스택에서 맨 위의 항목을 제거하지 않고 반환합니다.
  • 가득 찼습니다 스택이 가득 찼는지 확인합니다.
  • 비었다 스택이 비어 있는지 확인합니다.

스택 구현

다음 단계는 항목을 밀었다가 팝할 때 스택의 맨 위가 어떻게 이동하는지 보여줍니다.

1단계) 처음에는 스택이 비어 있습니다. 빈 스택의 맨 위는 -1로 설정됩니다.

2단계) 다음으로, 요소 5를 스택에 추가했습니다. 스택의 맨 위는 요소 5를 가리키게 됩니다.

3단계) ​​다음으로, 50번째 요소를 스택에 추가했습니다. 스택의 맨 위 요소가 이동하여 50번째 요소를 가리키게 됩니다.

4단계) 이제 스택에서 맨 위의 요소를 제거하는 팝(pop) 연산을 수행했습니다. 스택에서 요소 50이 제거되었습니다. 이제 스택의 맨 위는 요소 5를 가리킵니다.

스택 구현

푸시() 및 팝()

`stack::push()` 함수는 스택의 맨 위에 새 항목을 추가합니다. 삽입 후 스택 크기가 1 증가합니다. 이 함수는 다음과 같은 구문을 사용합니다.

stack.push(value)

값은 스택에 삽입할 항목입니다.

`stack::pop()` 함수는 스택의 맨 위 요소를 제거합니다. 이 요소는 스택에 새로 추가된 항목입니다. 요소를 제거하면 스택 크기가 1만큼 줄어듭니다. 함수 구문은 다음과 같습니다.

stack.pop()

이 함수는 매개변수를 사용하지 않습니다.

예 1 :

#include <iostream> 
#include <stack> 
using namespace std;
int main() {
	stack<int> st;
	st.push(10);
	st.push(20);
	st.push(30);
	st.push(40);
	
         st.pop();
	st.pop();

	while (!st.empty()) {
		cout << ' ' << st.top();
		st.pop();
	}
}

출력:

푸시() 및 팝()

다음은 코드의 스크린샷입니다.

푸시() 및 팝()

Code 설명 :

  1. 해당 기능을 사용하려면 코드에 iostream 헤더 파일을 포함하세요.
  2. 해당 기능을 사용하려면 코드에 스택 헤더 파일을 포함하세요.
  3. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  4. main() 함수를 호출합니다. 프로그램 로직은 이 기능 내에 추가되어야 합니다.
  5. 정수 값을 저장할 스택 st를 만듭니다.
  6. push() 함수를 사용하여 값 10을 스택에 삽입합니다.
  7. push() 함수를 사용하여 값 20을 스택에 삽입합니다.
  8. push() 함수를 사용하여 값 30을 스택에 삽입합니다.
  9. push() 함수를 사용하여 값 40을 스택에 삽입합니다.
  10. pop() 함수를 사용하여 스택에서 최상위 요소, 즉 40을 제거합니다. 이제 최상위 요소는 30이 됩니다.
  11. pop() 함수를 사용하여 스택에서 최상위 요소, 즉 30을 제거합니다. 이제 최상위 요소는 20이 됩니다.
  12. while 루프와 empty() 함수를 사용하여 스택이 비어 있지 않은지 확인합니다. !는 NOT 연산자입니다.
  13. 콘솔에 스택의 현재 내용을 인쇄합니다.
  14. 스택에서 pop() 함수를 호출합니다.
  15. while 루프 본문의 끝입니다.
  16. main() 함수 본문의 끝입니다.

비어 있음(), 크기(), 상단()

스택에는 스택과 해당 값을 가지고 놀 때 사용할 수 있는 내장 함수가 있습니다. 여기에는 다음이 포함됩니다.

  • 비어 있는()스택이 비어 있는지 여부를 확인합니다.
  • 크기()– 스택의 크기, 즉 스택에 있는 요소의 개수를 반환합니다.
  • 상단()- 스택의 최상단 요소에 접근합니다.

예 2 :

#include <iostream> 
#include <stack>  
using namespace std;
void createStack(stack <int> mystack)
{
	stack <int> ms = mystack;
	while (!ms.empty())
	{
		cout << '\t' << ms.top();
		ms.pop();
	}
	cout << '\n';
}
int main()
{
	stack <int> st;
	st.push(32);
	st.push(21);
	st.push(39);
	st.push(89);
	st.push(25);

	cout << "The stack st is: ";
	createStack(st);
	cout << "\n st.size() : " << st.size();
	cout << "\n st.top() : " << st.top();
	cout << "\n st.pop() : ";
	st.pop();
	createStack(st);
	return 0;
}

출력:

비어 있음(), 크기(), 상단()

다음은 코드의 스크린샷입니다.

비어 있음(), 크기(), 상단()

Code 설명 :

  1. 해당 기능을 사용하려면 코드에 iostream 헤더 파일을 포함하십시오.
  2. 해당 기능을 사용하려면 코드에 스택 헤더 파일을 포함하십시오.
  3. 클래스를 호출하지 않고 사용하려면 프로그램에 std 네임스페이스를 포함시킵니다.
  4. 스택 mystack을 생성하는 데 사용할 수 있는 createStack 함수를 생성합니다. 스택은 정수 세트를 보유합니다.
  5. createStack 함수 본문의 시작 부분입니다.
  6. mystack 데이터 유형의 인스턴스를 생성하고 ms라는 이름을 지정합니다.
  7. while 루프와 empty() 함수를 사용하여 스택이 비어 있는지 확인합니다.
  8. while 루프 본문의 시작입니다.
  9. 스택의 맨 위에 저장된 top() 함수를 사용합니다. \t 문자는 새 탭을 만듭니다.
  10. pop() 함수를 사용하여 스택 맨 위에 있는 요소를 삭제합니다.
  11. while 루프 본문의 끝입니다.
  12. 콘솔에 빈 줄을 인쇄합니다.
  13. createStack 함수 본문의 끝입니다.
  14. main() 함수를 호출합니다. 프로그램 로직은 main() 함수의 본문 내에 추가되어야 합니다.
  15. main() 함수 본문의 시작입니다.
  16. 스택 개체 st를 만듭니다.
  17. push() 함수를 사용하여 요소 32를 스택에 삽입합니다.
  18. push() 함수를 사용하여 요소 21를 스택에 삽입합니다.
  19. push() 함수를 사용하여 요소 39를 스택에 삽입합니다.
  20. push() 함수를 사용하여 요소 89를 스택에 삽입합니다.
  21. push() 함수를 사용하여 요소 25를 스택에 삽입합니다.
  22. 콘솔에 일부 텍스트를 인쇄합니다.
  23. createStack 함수를 호출하여 위의 삽입 작업을 스택에 실행합니다.
  24. 다른 텍스트와 함께 콘솔의 스택 크기를 인쇄합니다.
  25. 콘솔의 스택 맨 위에 있는 요소를 인쇄합니다.
  26. 콘솔에 일부 텍스트를 인쇄합니다.
  27. 스택의 맨 위에 있는 요소를 삭제합니다. 그런 다음 스택에 남아 있는 요소를 반환합니다.
  28. 위의 작업을 실행하려면 createStack 함수를 호출하세요.
  29. 프로그램은 성공적으로 완료되면 값을 반환해야 합니다.
  30. main() 함수 본문의 끝입니다.

emplace() 및 swap()

다음은 기타 내장 스택 함수입니다.

  • emplace()– 스택을 생성한 다음 새 요소를 스택의 맨 위에 삽입합니다.
  • 교환()– 스택의 내용을 다른 스택의 내용과 교환합니다.

예 3 :

#include <iostream>    
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st1;
	stack<int> st2;

	st1.emplace(12);
	st1.emplace(19);

	st2.emplace(20);
	st2.emplace(23);

	st1.swap(st2);

	cout << "st1 = ";
	while (!st1.empty()) {
		cout << st1.top() << " ";
		st1.pop();
	}

	cout << endl << "st2 = ";
	while (!st2.empty()) {
		cout << st2.top() << " ";
		st2.pop();
	}
}

출력:

emplace() 및 swap()

다음은 코드의 스크린샷입니다.

emplace() 및 swap()

Code 설명 :

  1. 해당 기능을 사용하려면 코드에 iostream 헤더 파일을 포함하세요.
  2. 해당 기능을 사용하려면 코드에 스택 헤더 파일을 포함하세요.
  3. 해당 기능을 사용하려면 코드에 cstdlib 헤더 파일을 포함하세요.
  4. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  5. main() 함수를 호출합니다. 프로그램 로직은 이 함수의 본문 내에 추가됩니다.
  6. 정수 값을 저장하기 위해 st1이라는 스택을 선언합니다.
  7. 정수 값을 저장하기 위해 st2이라는 스택을 선언합니다.
  8. emplace() 함수를 사용하여 st12이라는 스택에 정수 1를 삽입합니다.
  9. emplace() 함수를 사용하여 st19이라는 스택에 정수 1를 삽입합니다.
  10. emplace() 함수를 사용하여 st20이라는 스택에 정수 2를 삽입합니다.
  11. emplace() 함수를 사용하여 st23이라는 스택에 정수 2를 삽입합니다.
  12. swap() 함수를 사용하여 두 스택 st1 및 st2의 내용을 교환합니다. 스택 st1의 내용은 스택 st2로 이동되어야 합니다. 스택 st2의 내용은 스택 st1로 이동되어야 합니다.
  13. 콘솔에 일부 텍스트를 인쇄합니다.
  14. while 문과 empty() 함수를 사용하여 스택 st1이 비어 있지 않은지 확인합니다.
  15. 콘솔에 스택 st1의 내용을 인쇄합니다. " "는 콘솔에 인쇄할 때 스택 요소 사이에 공간을 추가합니다.
  16. 스택 st1에서 pop() 함수를 실행하여 최상위 요소를 제거합니다.
  17. while 문의 본문 끝입니다.
  18. 콘솔에 일부 텍스트를 인쇄합니다. 엔드는 C++ 끝줄에 대한 키워드입니다. 마우스 커서를 다음 줄로 이동하여 거기에서 인쇄를 시작합니다.
  19. while 문과 empty() 함수를 사용하여 스택 st2이 비어 있지 않은지 확인합니다.
  20. 콘솔에 스택 st2의 내용을 인쇄합니다. " "는 콘솔에 인쇄할 때 스택 요소 사이에 공간을 추가합니다.
  21. 스택 st2에서 pop() 함수를 실행하여 최상위 요소를 제거합니다.
  22. while 문의 본문 끝입니다.
  23. main() 함수 본문의 끝입니다.

STL의 스택

STL(Standard Template Library)은 공통적인 기능을 제공하는 템플릿 클래스와 함께 제공됩니다. C++ 데이터 구조. 따라서 STL에서도 스택을 구현할 수 있습니다. 우리는 이 라이브러리를 코드에 포함시키고 이를 사용하여 스택을 정의합니다.

stack<T> st; 

위 구문은 T 데이터 유형의 요소에 대한 스택을 선언합니다.

예 4 :

#include <iostream>      
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st;
	st.push(12);
	st.push(19);
	st.push(20);
	cout << st.top();   
	cout << st.size();  
}

출력:

STL의 스택

다음은 코드의 스크린샷입니다.

STL의 스택

Code 설명 :

  1. 해당 기능을 사용하려면 코드에 iostream 헤더 파일을 포함하세요.
  2. 해당 기능을 사용하려면 코드에 스택 헤더 파일을 포함하세요.
  3. 해당 기능을 사용하려면 코드에 cstdlib 헤더 파일을 포함하세요.
  4. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  5. main() 함수를 호출합니다. 프로그램 로직은 이 함수의 본문 내에 추가되어야 합니다.
  6. 정수 데이터를 저장하기 위해 스택 st를 선언합니다.
  7. 스택에 요소 12를 추가합니다.
  8. 스택에 요소 19를 추가합니다.
  9. 스택에 요소 20를 추가합니다.
  10. 콘솔의 스택 맨 위에 있는 요소를 인쇄합니다.
  11. 콘솔에 스택 크기를 인쇄합니다.
  12. main() 함수 본문의 끝입니다.

자주 묻는 질문

스택은 후입선출(LIFO) 방식을 따르므로 가장 최근 요소부터 먼저 제거됩니다. 큐는 선입선출(FIFO) 방식을 따르므로 가장 오래된 요소부터 먼저 제거됩니다. 각각 다른 처리 요구 사항에 적합합니다.

예. std::stack은 두 번째 템플릿 인수로 std::stack과 같은 모든 시퀀스 컨테이너를 허용합니다. 기본 deque는 대부분의 경우에 적합하지만, 스택이 예측 가능한 방식으로 증가할 때 vector는 메모리 지역성을 향상시킬 수 있습니다.

스택은 최상위 요소만 건드리기 때문에 push와 pop은 모두 상수 O(1) 시간 내에 실행됩니다. 기본 deque는 기존 항목을 이동하지 않고 항목을 추가하므로 스택 크기에 관계없이 성능이 예측 가능합니다.

std::stack은 이터레이터를 제공하지 않으므로 범위 기반 루프는 컴파일되지 않습니다. 모든 값을 읽으려면 스택을 복사한 다음 복사본에 대해 top() 및 pop()을 반복적으로 호출하거나, 순회가 필요한 경우 덱(deque)을 사용하십시오.

pop() 함수는 예외 처리를 위한 안전성 확보를 위해 삭제와 접근을 분리하도록 설계되었으며, 의도적으로 반환값이 void입니다. 읽기와 삭제를 한 번에 수행하면 복사 과정에서 오류가 발생했을 때 데이터 손실이 발생할 수 있으므로, 먼저 top() 함수를 호출한 후 pop() 함수를 호출해야 합니다.

아니요. std::stack은 내장된 동기화 기능을 제공하지 않으므로 여러 스레드에서 동시에 push 및 pop을 호출하면 데이터 경쟁이 발생합니다. 여러 스레드에서 하나의 스택을 사용하기 전에 뮤텍스 또는 다른 잠금 메커니즘을 사용하여 공유 액세스를 보호하십시오.

네. AI 코딩 도우미는 주석이나 함수 이름을 읽고 std::stack 선언, push 및 pop 루프, 순회 로직을 생성합니다. Revpop() 호출 전 empty() 테스트와 같은 생성된 경계 검사를 확인하는 것은 안전한 프로그램을 위해 여전히 중요합니다.

예. GitHub 부조종사 입력하는 동안 push, pop, top, empty() 호출을 완료하고 컨테이너 선택을 제안합니다. 2026년 출시. C++ 코드 인텔리전스는 심볼 인식 기능을 추가하여 여러 파일로 구성된 스택 제안의 일관성을 유지합니다.

이 게시물을 요약하면 다음과 같습니다.