스택(Stack)은 LIFO(Last In, First Out) 방식으로 작동하는 자료구조입니다. 즉, 가장 마지막에 추가된 요소가 가장 먼저 제거됩니다. 파이썬에서 기본적으로 제공하는 리스트(list)는 스택의 기능을 구현하는 데 적합한 자료구조입니다. 리스트를 상속하여 스택을 구현하면 리스트의 모든 기능을 활용하면서, 스택의 push, pop 기능을 쉽게 구현할 수 있습니다.
스택의 주요 동작:
- push(item): 스택의 가장 위에 요소를 추가합니다.
- pop(): 스택의 가장 위에 있는 요소를 제거하고 반환합니다.
- peek(): 스택의 가장 위에 있는 요소를 제거하지 않고 반환합니다.
- is_empty(): 스택이 비어 있는지 확인합니다.
파이썬 리스트를 상속한 스택 구현
class Stack(list):
def __init__(self):
super().__init__() # 리스트 초기화
def push(self, item):
"""스택에 요소를 추가"""
self.append(item) # 리스트의 append()를 사용해 스택의 push 기능 구현
def pop(self):
"""스택의 가장 위에 있는 요소를 제거하고 반환"""
if not self.is_empty():
return super().pop() # 리스트의 pop()을 사용해 스택의 pop 기능 구현
else:
raise IndexError("pop from empty stack")
def peek(self):
"""스택의 가장 위에 있는 요소를 반환 (제거하지 않음)"""
if not self.is_empty():
return self[-1] # 리스트의 마지막 요소를 반환
else:
raise IndexError("peek from empty stack")
def is_empty(self):
"""스택이 비어 있는지 확인"""
return len(self) == 0
def size(self):
"""스택의 크기 반환"""
return len(self)
# 스택 사용 예제
stack = Stack()
# 스택에 요소 추가 (push)
stack.push(10)
stack.push(20)
stack.push(30)
print("Current Stack:", stack) # 출력: [10, 20, 30]
# 스택의 가장 위 요소 확인 (peek)
top = stack.peek()
print("Top element:", top) # 출력: 30
# 스택에서 요소 제거 (pop)
popped = stack.pop()
print("Popped element:", popped) # 출력: 30
# 스택 상태 확인
print("Stack after pop:", stack) # 출력: [10, 20]
# 스택이 비어 있는지 확인
print("Is stack empty?", stack.is_empty()) # 출력: False
# 스택 크기 확인
print("Stack size:", stack.size()) # 출력: 2
예제 설명:
push(item)
: 리스트의append()
메서드를 사용하여 스택의 맨 위에 요소를 추가합니다.pop()
: 리스트의pop()
메서드를 사용하여 스택의 맨 위 요소를 제거하고 반환합니다. 스택이 비어 있으면IndexError
를 발생시킵니다.peek()
: 리스트의 마지막 요소(스택의 맨 위)를 반환하지만 제거하지 않습니다. 스택이 비어 있으면IndexError
를 발생시킵니다.is_empty()
: 스택이 비어 있는지 확인합니다.size()
: 스택에 있는 요소의 개수를 반환합니다.
출력 결과:
Current Stack: [10, 20, 30]
Top element: 30
Popped element: 30
Stack after pop: [10, 20]
Is stack empty? False
Stack size: 2
장점:
- 리스트 상속: 파이썬 리스트는 동적 배열로 동작하기 때문에, 추가적인 메모리 관리 없이 스택의 요소를 쉽게 추가하거나 제거할 수 있습니다.
- 단순 구현: 리스트의 기본 기능을 그대로 사용하면서, 스택의 동작을 간단하게 구현할 수 있습니다.
스택 사용 사례:
- 수식의 괄호 검증: 수학 또는 프로그래밍 수식에서 괄호의 짝을 맞출 때 스택을 사용하여 유효성을 검증할 수 있습니다.
- 재귀 호출의 관리: 재귀 호출 과정에서 함수 호출 스택을 관리하는데 스택 자료구조가 유용합니다.
- Undo/Redo 기능: 텍스트 편집기와 같은 프로그램에서 이전 상태로 돌아가거나 다시 앞으로 이동할 때 스택을 사용합니다.
이와 같이 파이썬 리스트를 상속하여 스택 자료구조를 구현하면, 간단한 코드로 스택의 주요 기능을 쉽게 사용할 수 있습니다.
'실용적인 코드 샘플' 카테고리의 다른 글
[실용적인 코드 샘플] Way Point기반 시나리오 맵 자료구조 (10) | 2024.10.22 |
---|---|
[실용적인 코드 샘플] 메타클래스 기반 게임 설정값 저장 클래스 (0) | 2024.10.20 |
[실용적인 코드 샘플] Singleton 패턴 (클래스 변수, 메타클래스 활용) (2) | 2024.10.19 |
[실용적인 코드 샘플] 고정 크기 리스트 자료구조 (FixedSizeList) (0) | 2024.10.18 |
[실용적인 코드 샘플] 제너릭을 이용한 `Triple` 자료구조 1 (2) | 2024.10.16 |