스택(Stack)과 큐(Queue)란?
스택과 큐는 데이터를 저장하고 꺼내는 순서를 규정한 선형 자료구조(linear data structure) 임.
스택(Stack)
- 마지막에 들어온 데이터가 가장 먼저 나가는 구조(LIFO, Last In First Out)
- 즉, “나중에 넣은 것이 먼저 나온다.” 라는 특징을 가짐.
예를 들어, 접시를 쌓아두는 것을 생각하면 이해하기 쉬움.
맨 위에 놓은 접시가 가장 먼저 꺼내짐.
✅ 주요 연산
연산 | 설명 |
---|
push(item) | 스택에 데이터 추가 |
pop() | 가장 위의 데이터 제거 및 반환 |
peek() | 최상단 데이터 조회(제거하지 않음) |
isEmpty() | 스택이 비어있는지 확인 |
💻 예제 코드 (JavaScript)
1
2
3
4
5
6
7
8
9
10
11
| const stack = [];
stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack); // [1, 2, 3]
console.log(stack.pop()); // 3
console.log(stack); // [1, 2]
console.log(stack[stack.length - 1]); // 2 (peek)
|
큐(Queue)
- 먼저 들어온 데이터가 먼저 나가는 구조(FIFO, First In First Out)
- 즉, “먼저 온 것이 먼저 나간다.”
은행 창구나 버스 줄을 생각하면 이해하기 쉬움.
✅ 주요 연산
연산 | 설명 |
---|
enqueue(item) | 큐의 뒤쪽에 데이터 추가 |
dequeue() | 큐의 앞쪽에서 데이터 제거 및 반환 |
front() | 큐의 맨 앞 데이터 조회 |
isEmpty() | 큐가 비어있는지 확인 |
💻 예제 코드 (JavaScript)
1
2
3
4
5
6
7
8
9
10
11
| const queue = [];
queue.push(1);
queue.push(2);
queue.push(3);
console.log(queue); // [1, 2, 3]
console.log(queue.shift()); // 1
console.log(queue); // [2, 3]
console.log(queue[0]); // 2 (front)
|
⚖️ 스택 vs 큐 비교
구분 | 스택(Stack) | 큐(Queue) |
---|
구조 | LIFO (후입선출) | FIFO (선입선출) |
삽입 위치 | top(맨 위) | rear(뒤쪽) |
삭제 위치 | top(맨 위) | front(앞쪽) |
주요 메서드 | push(), pop() | enqueue(), dequeue() |
- 둘 다 선형(일렬(순서가 있는 형태)) 구조이며, 탐색보다 ‘순서 제어’가 핵심
알고리즘 예시
프로그래머스 - 같은 숫자는 싫어
내가 푼 방식
1
2
3
4
5
6
7
8
9
10
11
| function solution(arr) {
var answer = [];
for(let i = 0 ; i < arr.length ; i++) {
if(answer.length == 0) {
answer.push(arr[i]);
} else if(answer[answer.length-1] !== arr[i]) {
answer.push(arr[i]);
}
}
return answer;
}
|
스택 풀이로 표현하자면 ? (조금 더 명시적으로)
1
2
3
4
5
6
7
8
9
10
11
| function solution(arr) {
const stack = [];
for (let num of arr) {
if (stack[stack.length - 1] !== num) {
stack.push(num);
}
}
return stack;
}
|
프로그래머스 - 올바른 괄호
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| function solution(s){
const array = s.split("");
const stack = [];
if(array[0] === ")") return false;
for(let str of array) {
if(stack[stack.length - 1] === "(" && str === ")") {
stack.pop();
} else {
stack.push(str);
}
}
return stack.length === 0;
}
|
END