해당 포스팅은 "코딩 테스트 합격자 되기 C++편" 의 책 및 강의를 보며 포스팅 한 내용입니다.
[지금 무료] 코딩 테스트 합격자 되기 - C++ 강의 | dremdeveloper - 인프런
dremdeveloper | 코딩 테스트 합격을 위한 C++ 강의, 책 없이도 가능! 저자와 직접 소통 가능한 커뮤니티 제공!, [사진]여기에 문의 하세요https://open.kakao.com/o/gX0WnTCf📘 코딩 테스트 합격자 되기 - C++편
www.inflearn.com
💬키워드
스택 : 가장 마지막에 추가한 항목이 가장 먼저 제거되는, 데이터가 쌓이는 구조의 컨테이너
큐 : 가장 마지막에 추가한 항목이 가장 마지막에 제거되는, 선착순 형태의 컨테이너
🪄목차
https://www.youtube.com/watch?v=xc0HZiqh8Fs
1. 스택(Stack)
2. 큐(Queue)
📝내용
스택(Stack)
1. 정의
- 중복을 허용하는 순서가 있는 컨테이너 자료구조
- LIFO(Last In First Out), 최근에 들어온 원소가 먼저 삭제됨, 후입선출
- 삽입/삭제 : O(1)
- 탐색 및 임의 접근은 불가능하다.


2. 사용법
//############################################################
// | cafe | http://cafe.naver.com/dremdelover |
// | Q&A | https://open.kakao.com/o/gX0WnTCf |
// | business | ultrasuperrok@gmail.com |
//############################################################
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> s;
// 원소 삽입
s.push(1); // push: 스택의 맨 위에 원소를 추가합니다. 예를 들어, 1을 추가하면 스택의 상태는 [1]이 됩니다. 시간복잡도: O(1)
s.push(2); // push: 스택의 맨 위에 원소를 추가합니다. 예를 들어, 2를 추가하면 스택의 상태는 [1, 2]가 됩니다. 시간복잡도: O(1)
s.push(3); // push: 스택의 맨 위에 원소를 추가합니다. 예를 들어, 3을 추가하면 스택의 상태는 [1, 2, 3]이 됩니다. 시간복잡도: O(1)
// 맨 위 원소 확인
cout << "Top element: " << s.top() << endl; // 출력: 3
// top: 스택의 맨 위 원소를 반환합니다. 스택이 비어 있으면 예외를 던집니다. 예를 들어, 현재 스택의 상태는 [1, 2, 3]이므로 top()은 3을 반환합니다. 시간복잡도: O(1)
// 원소 삭제
s.pop(); // pop: 스택의 맨 위 원소를 제거합니다. 스택이 비어 있으면 예외를 던집니다. 예를 들어, 현재 스택의 상태는 [1, 2, 3]이므로 pop()은 3을 제거하여 [1, 2]가 됩니다. 시간복잡도: O(1)
cout << "Top element after pop: " << s.top() << endl; // 출력: 2
// top: 스택의 맨 위 원소를 반환합니다. 스택이 비어 있으면 예외를 던집니다. 예를 들어, 현재 스택의 상태는 [1, 2]이므로 top()은 2를 반환합니다. 시간복잡도: O(1)
// 스택이 비어있는지 확인
if (!s.empty()) {
cout << "Stack is not empty" << endl; // 출력: Stack is not empty
}
// empty: 스택이 비어 있는지 여부를 확인합니다. 비어 있으면 true, 아니면 false를 반환합니다. 예를 들어, 현재 스택의 상태는 [1, 2]이므로 empty()는 false를 반환합니다. 시간복잡도: O(1)
// 스택의 크기 확인
cout << "Stack size: " << s.size() << endl; // 출력: 2
// size: 스택에 있는 원소의 개수를 반환합니다. 예를 들어, 현재 스택의 상태는 [1, 2]이므로 size()는 2를 반환합니다. 시간복잡도: O(1)
// 스택에서 모든 원소를 pop하여 출력
while (!s.empty()) {
cout << "Popping element: " << s.top() << endl;
s.pop();
}
// 반복문을 통해 모든 원소를 제거합니다. 예를 들어, 현재 스택의 상태는 [1, 2]이므로 pop()은 2와 1을 순서대로 제거합니다. 시간복잡도: O(1)
// 스택이 비어있는지 확인
if (s.empty()) {
cout << "Stack is empty after popping all elements" << endl; // 출력: Stack is empty after popping all elements
}
// empty: 스택이 비어 있는지 여부를 확인합니다. 비어 있으면 true, 아니면 false를 반환합니다. 예를 들어, 현재 스택의 상태는 빈 상태이므로 empty()는 true를 반환합니다. 시간복잡도: O(1)
return 0;
}
/*
* 각 메서드의 동작 및 시간복잡도:
* - push: 스택의 맨 위에 원소를 추가합니다. 삽입된 원소는 기존 원소 위에 쌓이게 됩니다.
* 예를 들어, push(3)를 호출하면 스택의 상태는 [1, 2, 3]이 됩니다. 시간복잡도: O(1)
* - pop: 스택의 맨 위 원소를 제거합니다. 가장 최근에 추가된 원소가 제거됩니다.
* 예를 들어, pop()을 호출하면 스택의 상태는 [1, 2]가 됩니다. 시간복잡도: O(1)
* - top: 스택의 맨 위 원소를 반환합니다. 스택이 비어 있으면 예외를 던집니다.
* 예를 들어, top()을 호출하면 현재 스택의 맨 위 원소 2가 반환됩니다. 시간복잡도: O(1)
* - empty: 스택이 비어 있는지 여부를 확인합니다. 스택이 비어 있으면 true, 아니면 false를 반환합니다.
* 예를 들어, 스택이 비어 있지 않으면 empty()는 false를 반환합니다. 시간복잡도: O(1)
* - size: 스택에 있는 원소의 개수를 반환합니다. 예를 들어, size()는 현재 스택에 2개의 원소가
* 있으므로 2를 반환합니다. 시간복잡도: O(1)
*/
/*
* 스택을 사용해야 하는 경우:
* - 함수 호출이나 재귀 호출의 관리를 위해 (콜 스택)
* - 괄호의 짝을 맞추거나 문자열의 역순 변환 등 LIFO 구조가 필요한 경우
* - Depth-First Search(DFS)와 같은 알고리즘 구현 시
* 스택을 사용하지 말아야 하는 경우:
* - 임의 접근이 필요한 경우 (스택은 특정 위치의 원소 접근이 불가능)
* - 중간 위치의 삽입/삭제가 빈번한 경우 (스택은 맨 위에서만 삽입/삭제 가능)
* - FIFO(First In First Out) 구조가 필요한 경우 (큐 사용 권장)
*/
큐(Queue)
1. 정의
- 중복을 허용하는 순서가 있는 선형 데이터 구조
- FIFO(First In First Out), 먼저 들어온 원소가 먼저 삭제됨(선착순)
- 삽입/삭제 : O(1)
- 탐색 및 임의 접근 불가능


2. 사용법
//############################################################
// | cafe | http://cafe.naver.com/dremdelover |
// | Q&A | https://open.kakao.com/o/gX0WnTCf |
// | business | ultrasuperrok@gmail.com |
//############################################################
#include <iostream>
#include <queue>
using namespace std;
// std::queue는 C++ STL에 포함된 컨테이너 어댑터입니다.
// - FIFO(First-In-First-Out) 원칙에 따라 동작하는 데이터 구조입니다.
// 좋은 사용 시기:
// - 데이터를 순서대로 처리해야 할 때, 예를 들면, 너비 우선 탐색(BFS) 알고리즘, 대기열 구현 등.
// 성능 이슈:
// - STL queue는 일반적으로 빠른 연산을 제공합니다. 하지만, 중간 요소에 직접 접근할 수 없습니다. 중간 요소를 검색하거나 수정하려면 다른 자료구조를 사용하는 것이 좋습니다.
int main() {
queue<int> q;
// push: 큐의 끝에 요소 추가, O(1)
q.push(1);
q.push(2);
q.push(3);
// front: 큐의 첫 번째 요소에 접근, O(1)
cout << "Front element: " << q.front() << endl; // 출력: Front element: 1
// pop: 큐의 첫 번째 요소 제거, O(1)
q.pop();
cout << "Front element after pop: " << q.front() << endl; // 출력: Front element after pop: 2
// empty: 큐가 비어 있는지 확인, O(1)
if (!q.empty()) {
cout << "Queue is not empty" << endl; // 출력: Queue is not empty
}
// size: 큐의 크기 확인, O(1)
cout << "Queue size: " << q.size() << endl; // 출력: Queue size: 2
// 성능 저하 예제:
// queue는 중간 요소에 직접 접근할 수 없으므로, 중간 요소를 검색하거나 수정하는 연산이 필요한 경우
// queue보다는 다른 자료 구조를 사용하는 것이 좋습니다.
return 0;
}
'GroupStudy > [C++]코딩 테스트 합격자 되기' 카테고리의 다른 글
| [코딩 테스트 합격자 되기] 2주차 - 스택/큐 (0) | 2024.07.13 |
|---|---|
| [코딩 테스트 합격자 되기] C++ - 알고리즘 (0) | 2024.07.11 |
| [코딩 테스트 합격자 되기] C++ - unordered_map, unordered_set (0) | 2024.07.10 |
| [코딩 테스트 합격자 되기] C++ - STL 반복자, 컨테이너(vector,set,map) (0) | 2024.07.10 |
| [코딩 테스트 합격자 되기] C++ - Built-in 데이터 타입(변수&자료형) (0) | 2024.07.09 |