스택
- 스택의 어원: ‘쌓는다’
- 선입후출 or FILO(First In Last Out): 먼저 들어간 것이 마지막에 나오는 규칙
- 스택에 삽입하는 연산은 푸시, 꺼내는 연산은 팝
- 파이썬의 경우 직접적으로 스택을 제공하진 않지만 대안으로 리스트에 append()메서드와 push()메서드로 스택을 대체할 수 있다.
- 덱(deque)은 양쪽에서 데이터를 삽입하거나 삭제할 수 있는 자료구조다. 이런 특징을 응용하면 한쪽으로만 동작하는 스택처럼 사용할 수 있다.
- 스택의 ADT
- 푸시(push): 데이터 푸시
- 팝(pop): 최근에 푸시한 데이터 팝하고, 그 데이터 반환
- 가득 찼는지 확인(isFull): 스택에 들어 있는 데이터 개수가 max size인지 boolean
- 비었는지 확인(isEmpty): 스택에 들어 있는 데이터가 하나도 없는지 boolean
- 탑(top): 최근에 삽입한 데이터의 위치를 저장할 변수
- 스택의 세부 동작
- push(): IsFull()로 가득 찼는지 확인 -> 그렇지 않다면 top을 1만큼 증가 -> top이 가리키는 위치에 추가
- pop(): IsEmpty()로 데이터가 없는 건 아닌지 확인 -> 데이터가 있다면 top을 1만큼 감소시키고 마지막으로 삽입한 데이터 반환, 실제 배열에 데이터가 남아있어도 top이 -1이라면 스택은 빈 것으로 본다.
- 파이썬의 경우 위의 세부 동작을 일일히 구현하는 함수를 만들 필요는 없고 기존의 append(), pop() 메서드를 사용하며, 크기를 구하는 경우 len()을 사용하면 된다.
큐
- 큐는 ‘줄을 서다’라는 뜻.
- 선입선출 or FIFO(First In First Out)
- 큐에 삽입하는 연산은 푸시, 꺼내는 연산은 팝
- 큐의 ADT
- 푸시(push): 데이터 푸시
- 팝(pop): 큐의 가장 앞에 위치한 데이터 팝하고, 그 데이터 반환
- 가득 찼는지 확인(isFull): 스택에 들어 있는 데이터 개수가 max size인지 boolean
- 비었는지 확인(isEmpty): 스택에 들어 있는 데이터가 하나도 없는지 boolean (front == rear인지)
- front: 큐의 앞을 의미하며, 가장 마지막에 팝한 위치를 기록한다.
- rear: 큐의 뒤를 의미하며, 가장 최근에 푸시한 데이터의 위치를 기록한다.
- 큐는 front의 다음부터 rear까지를 큐가 관리하는 데이터로 생각한다. pop을 할 때마다 front의 값이 하나씩 증가를 하고 그 위치를 기점으로 데이터를 관리하므로 메모리 공간이 낭비된다. 그런데 파이썬의 경우 리스트의 길이를 자동으로 관리하므로 메모리 효율을 위해 원형 큐 같은 것을 굳이 쓸 필요는 없다.
- 큐를 구현하기 위해 리스트를 활용할 수도 있고, 덱을 활용할 수도 있는데 덱의 성능이 월등하므로 덱을 이용하는 것이 좋다. 대표적으로 리스트의 pop(0)과 덱의 popleft()를 비교하면 알 수 있다.
'알고리즘' 카테고리의 다른 글
[알고리즘] 해시 (0) | 2025.04.30 |
---|---|
[알고리즘] 배열 (0) | 2025.03.04 |
[코딩테스트] 파이썬의 기본 자료형 (0) | 2025.02.25 |
[코딩테스트] 알고리즘 문제풀이 전략 (0) | 2025.02.25 |
[알고리즘 문제] 하샤드 수 (1) | 2022.11.23 |