기본 개념은 LIFO(Last In First Out)이다.
구현할 메소드는 아래와 같다.
- __init__(self)
- __len__(self)
- push(self, val)
- pop(self)
- top(self)
class Stack:
def __init__(self):
self.items = []
def __len__(self):
return len(self.items)
def push(self, val):
self.items.append(val)
def pop(self):
if len(self) == 0:
return None
return self.items.pop()
def top(self):
if len(self) == 0:
return None
return self.items[-1]
기본 개념은 FIFO(First In First Out)이다.
공부하며 찾아보니 자료구조 Queue를 구현할 때, 맴버 변수의 선언 및 활용에 있어서 두 가지의 차이점이 있었다.
CASE_1 )
- self.items : 요소들을 담는 리스트
- self.front_index : 제일 앞의 위치를 저장하는 상수
self.rear_index까지 선언하는 경우도 확인할 수 있었음
CASE_2 )
- self.items : 요소들을 담는 리스트
위와 같은 두 가지의 경우가 있었고, 코드는 아래와 같다.
구현할 메소드는 공통적으로 아래와 같다.
- __init__(self)
- __len__(self)
- is_empty(self)
- enqueue(self, item)
- dequeue(self)
- front(self)
- back(self)
# **CASE_1**
class Queue:
def __init__(self):
self.items = []
self.front_index = 0
def __len__(self):
return len(self.items) - self.front_index
def is_empty(self):
return len(self) == self.front_index
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
if self.is_empty():
return None
item = self.items[self.front_index]
self.front_index += 1
# 리스트의 절반 이상이 비었을 때 리스트를 정리
if self.front_index > len(self.items) // 2:
self.items = self.items[self.front_index:]
self.front_index = 0
return item
def front(self):
if self.is_empty():
return None
return self.items[self.front_index]
def back(self):
if self.is_empty():
return None
return self.items[-1]
# **CASE_2**
class Queue:
def __init__(self):
self.items = []
def __len__(self):
return len(self.items)
def is_empty(self):
return len(self.items) == 0
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
if not self.is_empty():
return self.items.pop(0)
return None
def front(self):
if not self.is_empty():
return self.items[0]
return None
def back(self):
if not self.is_empty():
return self.items[-1]
return None