반응형
스택 Stack
데이터를 임시 저장하는, 하나씩 쌓아 올린 형태의 자료 구조
LIFO - Last In First Out 또는 FILO - First In Last Out
like 식당에 쌓여있는 접시, 프링글스, 콘 아이스크림
아래에서부터 쌓고, 위에서부터 꺼내는 방식
스택의 동작은 모두 Top 이라는 스택의 한쪽 끝에서만 일어난다
스택 구성
stk 스택 배열 - 푸시한 데이터를 저장하는 스택 본체인 list 형 배열
capacity 스택 크기 - 스택의 최대 크기를 나타내는 int 형 정수
ptr 스택 포인터 - 스택이 쌓여 있는 데이터를 개수를 나타내는 정수값
스택의 연산
push() Top 에 있는 원소를 제거
pop(x) 원소 x 를 Top 에 추가
peek() 스택의 상단에 있는 항목을 제거하지 않고 반환 (Top 요소를 확인만 하고 제거는 하지 않음)
is_empty() 스택이 비어 있는지 확인
size 스택에 있는 항목의 개수를 반환
Overflow - 스택이 완전히 꽉 찬 상태에서 추가로 항목을 삽입하려고 할 때 발생
Underflow - 스택이 완전히 비어있는 상태에서 항목을 제거하려고 할 때 발생
스택 코드
class Stack:
def __init__(self) -> None:
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
if not self.is_empty():
return self.items.pop()
else:
raise IndexError("Pop from Empty Stack")
def peep(self):
if not self.is_empty():
return self.items[-1]
else:
raise IndexError("Peek from Empty Stack")
def is_empty(self):
return len(self.items) == 0
def size(self):
return len(self.items)
Push 작업 단계
1. 스택이 가득 찼는지 확인한다
2. 스택이 가득 차면 오류가 발생하고 종료된다
3. 스택이 가득 차지 않으면 Top 값을 증가시킨다
4. Top 이 가리키는 스택 위치에 데이터를 추가한다
Pop 작업 단계
1. 스택이 비어 있는지 확인한다
2. 스택이 비어 있으면 오류가 발생하고 종료된다
3. 스택이 비어 있지 않으면 Top 이 가리키는 데이터를 제거한다
4. Top 값을 감소시킨다
5. 성공을 반환한다
시간 복잡도
Operation | Average | Worst |
Access | O(n) | O(n) |
Search | O(n) | O(n) |
Push | O(1) | O(1) |
Pop | O(1) | O(1) |
Push 와 Pop 은 항상 Top 에서만 일어나기 때문에 O(1) 시간이 걸린다
스택의 장단점
1. 배열 사용
- 장점 ; 구현하기 쉬움
- 단점 ; 크기가 동적이 아님 (고정되어 있음)
2. 연결 리스트 사용
- 장점 ; 크기가 동적임
- 단점 ; 포인터를 위한 추가 메모리 공간이 필요함
스택 사용 예시
1) 괄호 짝 맞추기
2) 10진수를 2진수로 변환하기
Deque 양방향 연결리스트 Python
# 양방향 연결리스트 정의
class Node:
def __init__(self, item):
self.data = item
self.prev = None
self.next = None
class DoublyLinkedList:
def __init__(self, item):
self.nodeCount = 0
self.head = Node(None)
self.tail = Node(None)
self.head.prev = None
self.head.next = self.tail
self.tail.prev = self.head
self.tail.next = None
# 양방향 연결리스트로 스택 구현
class LinkedListStack:
def __init__(self):
self.data = DoublyLinkedList()
def size(self):
return self.data.getLength()
def isEmpty(self):
return self.size() == 0
def push(self, item):
node = Node(item)
self.data.insertAt(self, size() +1, node)
def pop(self):
return self.data.popAt(self.size())
def peek(self):
return self.data.getAt(self.size()).data
반응형
'TIL > Python' 카테고리의 다른 글
[TIL] sorted() Python (0) | 2024.09.13 |
---|---|
[TIL] 큐 Queue Python (2) | 2024.09.12 |
[TIL] 재귀 함수 Recursion Function Python (0) | 2024.09.11 |
[TIL] 병합 정렬 Merge Sort Python (0) | 2024.09.10 |
[TIL] 퀵 정렬 Quick Sort 추가 공부 (3) | 2024.09.09 |