자료구조
스택(stack)
귤먹는코더
2025. 2. 15. 22:01
728x90
스택(stack)이란?
- 스택은 한쪽 끝에서만 데이터를 넣고 뺄 수 있는 제한적으로 접근할 수 있는 후입선출(Last-In-First-Out) 형태의 선형 구조이다.
스택의 주요 연산
- Push: 데이터를 스택의 맨 위에 추가하는 연산
- Pop: 스택의 맨 위 데이터를 제거하고 반환하는 연산
- Peek(Top): 스택의 맨 위 데이터를 제거하지 않고 확인하는 연산
- isEmpty: 스택이 비어있는지 확인하는 연산 (boolean 타입을 반환)
스택의 구조
- Bottom: 가장 밑에 있는 데이터 또는 인덱스
- Top: 가장 위에 있는 데이터 또는 인덱스
- Capacity: 스택에 담을 수 있는 데이터의 총 용량
- Size: 현재 스택에 담겨져있는 데이터의 개수
스택의 동작원리
[초기 상태]
(Stack이 비어있음)
Push(1) → [1]
Push(2) → [1, 2]
Push(3) → [1, 2, 3]
Pop() → [1, 2] (반환값: 3)
Peek() → [1, 2] (반환값: 2)
스택의 활용 예시
- 함수 호출(재귀 호출): 함수가 호출될 때 실행 상태를 스택에 저장하고, 호출이 끝나면 스택에서 제거
- 웹 브라우저 뒤로 가기: 방문한 페이지를 스택에 저장하고, 뒤로 가기 시 최근 페이지를 제거
- 괄호 검사: 코드에서 괄호가 올바르게 닫혔는지 확인하는 데 사용
- DFS(깊이 우선 탐색): 그래프 탐색 알고리즘에서 활용
코딩 테스트에서 자주 나오는 예제
1. 올바른 괄호검사
function isValidParentheses(s) {
const stack = [];
const map = { ')': '(', '}': '{', ']': '[' };
for (let char of s) {
if (char in map) {
if (stack.length === 0 || stack.pop() !== map[char]) {
return false;
}
} else {
stack.push(char);
}
}
return stack.length === 0;
}
console.log(isValidParentheses("(){}[]")); // true
console.log(isValidParentheses("(]")); // false
console.log(isValidParentheses("({})")); // true
2. 다음 큰 요소 찾기 (Next Greater Element)
function nextGreaterElement(nums) {
let stack = [], result = Array(nums.length).fill(-1);
for (let i = 0; i < nums.length; i++) {
while (stack.length && nums[stack[stack.length - 1]] < nums[i]) {
result[stack.pop()] = nums[i];
}
stack.push(i);
}
return result;
}
console.log(nextGreaterElement([2, 1, 2, 4, 3])); // [4, 2, 4, -1, -1]
스택의 장점과 단점
장점
- 구현이 간단하고 빠름 (O(1) 시간 복잡도로 Push, Pop 가능)
- 메모리 사용이 효율적 (필요할 때만 공간을 사용)
단점
- 한쪽 방향으로만 데이터 접근 가능 (LIFO 특성)
- 크기가 제한된 배열 기반 스택의 경우 오버플로(Overflow) 발생 가능
참고 자료
https://velog.io/@alkwen0996/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9DStack
728x90