위의 그림처럼 데이터를 한 쪽에서만 넣고 뺄 수 있는 구조로 LIFO(Last In First Out)리고 불립니다.
즉, 마지막에 쌓은 데이터가 먼저 나오는 것이죠
*장점
구조가 단순하기에 구현이 쉽고 데이터 저장 및 읽는 속도가 빠릅니다.
*단점
스택에 데이터를 쌓을 범위를 미리 저장해야기에 저장 공간 낭비 발생
= append(push) :데이터 집어넣기
#Stack를 직접 클래스와 함수로 만들어서 구현하기
class Stack:
def __init__(self): #클래스의 첫 함수는 __init__로 하는 게 국룰
self.head = Node() #head에 빈 노드가 있는 상태 (Null)
self._size = 0 #size 0으로 초기화
def push(self, data): #data를 넣는 푸쉬
new_node = Node() #처음에 node는 없는 상태
new_node.data = data # data 할당
new_node.next = self.head.next #head의 다음에 새로운 노드가 들어간다
self.head.next = new_node #head의 다음은 새로운 노드 (들어온 상태)
self._size += 1 #들어왔으니 사이즈가 증가
def pop(self): #data를 빼는 pop
if self.size == 0: #size가 0, 즉 노드가 없다면
return None #빈 노드라고 출력
ret = self.head.next #ret눈 해드 다음에 오는 것
self.head.next = ret.next # 헤드 다음이 ret의 다음
self._size -= 1 # 데이터를 뺐으니 사이즈 감소
return ret.data # 뺀 후 그 데이터 추출
def peek(self): #peek기능 확인
if self._size == 0: #size가 0이라면 추출할 데이터가 없으니 None출력
return None #None 출력
return self.head.next.data #그게 아니라면 가장 최근에 들어온 거 출력
def size(self):# size함수
return self._size # 몇 개의 숫자가 들어있나 체크
class Node:
def __init__(self):
self.next = None
self.data = None
if __name__ == "__main__":
s = Stack()
print("s.push(3)") #3넣자고 출력
s.push(3)#3넣기
print("s.push(5)")#5넣자고 출력
s.push(5)#5넣기
print("s.push(1)") # 1넣자고 출력
s.push(1) #1넣기
print("s.push(9)")# 9넣자고 출력
s.push(9)#9 넣기
print(f"s.size(): {s.size()}") #몇 개의 숫자가 들어왔는지 출력
print(f"s.peek(): {s.peek()}")# 마지막에 들어온 숫자
print(f"s.pop(): {s.pop()}")# 마지막에 있는 것부터 뺀다
print(f"s.pop(): {s.pop()}")#그 다음
print(f"s.pop(): {s.pop()}")#그 다다음
print(f"s.pop(): {s.pop()}")#그 다다다음
s.peek()#다 빠졌나 확인
print(f"s.peek(): {s.peek()}") #다 뺀 상태라서 데이터가 없어서 none 출력