Stack

매일 공부(ML)·2022년 4월 7일
0

이어드림

목록 보기
6/146

Stack

위의 그림처럼 데이터를 한 쪽에서만 넣고 뺄 수 있는 구조로 LIFO(Last In First Out)리고 불립니다.

즉, 마지막에 쌓은 데이터가 먼저 나오는 것이죠


장단점

*장점

구조가 단순하기에 구현이 쉽고 데이터 저장 및 읽는 속도가 빠릅니다.

*단점

스택에 데이터를 쌓을 범위를 미리 저장해야기에 저장 공간 낭비 발생


메서드

= append(push) :데이터 집어넣기

  • pop:데이터 빼기

Code

#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 출력

profile
성장을 도울 아카이빙 블로그

0개의 댓글