스택(Stack)
은 한 쪽 끝에서만 자료를 추가/반환/삭제할 수 있는 후입선출(LIFO - Last In First Out) 형식의 선형 자료구조
이다.
stack은 '어떤 물체들이 쌓아올려진 더미'를 뜻한다.
가령 접시를 잔뜩 쌓아올릴 때, 가장 처음 올려둔 접시는 맨밑에 위치한다.
접시를 뺄 때는 맨위 접시(top)를 빼게 되며, 이는 가장 마지막에 올려둔 것이다.
(접시를 쌓음 = 데이터 추가 = push, 접시를 뺌 = 데이터 반환 = pop)
참고 :
꽉 찬 스택에 push하려는 경우를 오버플로우(Overflow), 텅 빈 스택에서 pop하려는 경우를 언더플로우(Underflow)라고 한다.
class Stack:
maxlen = 10
def __init__(self):
self.tos = 0
self.array = [None] * self.maxlen
def push(self, item):
if not self.full():
self.array[self.tos] = item
self.tos += 1
def pop(self):
if not self.empty():
self.tos -= 1
return self.array[self.tos]
def top(self):
return self.array[self.tos - 1]
def size(self):
return self.tos
def empty(self):
return self.size() == 0
def full(self):
return self.size() == self.maxlen
class Node:
def __init__(self, item, link=None):
self.item = item
self.link = link
class Stack:
maxlen = 10
def __init__(self):
self.tos = None
self.length = 0
def push(self, item):
if not self.full():
self.tos = Node(item, self.tos)
self.length += 1
def pop(self):
if not self.empty():
item = self.tos.item
self.tos = self.tos.link
self.length -= 1
return item
def top(self):
return self.tos.item
def size(self):
return self.length
def empty(self):
return self.size() == 0
def full(self):
return self.size() == self.maxlen
만약 위 코드에서 1, 2, 3, 4, 5를 차례로 push하면 구현된 스택은 아래와 같은 상태를 나타내고 있을 것이다.
참고 자료 :
https://ko.wikipedia.org/wiki/스택
https://namu.wiki/w/스택(자료구조)
파이썬 알고리즘 인터뷰 (박상길 지음)