처음부터 차근차근 파이썬 자세히보기

Python-자료 구조/Python-선형 자료 구조

Python-추상 데이터 타입/선형 자료 구조(1. 스택)-수정중

윤빵빵영 2020. 5. 28. 22:12

스택(Stack)

배열의 끝에서만 데이터를 접근할 수 있는 선형 자료 구조

1. 배열 인덱스 접근이 제한된다.

2. 후입선출(LIFO, Last In First Out)의 특징을 갖는다.

push, pop, peek, empty, size의 메서드를 갖는다.

 

리스트를 이용한 스택 클래스 구현

class Stack(object):
    def __init__(self):
        self.items = []

    def isEmpty(self):

        return not bool(self.items)

    def push(self, value):
        self.items.append(value)

    def pop(self):

        value = self.items.pop()
        if value is not None:
            return value

        else:
            print("Stack is empty.")

    def size(self):
        return len(self.items)

    def peek(self):
        if self.items:
            return self.items[-1]

        else:
            print("Stakc is empty.")

    def __repr__(self):
        return repr(self.items)

if __name__ == "__main__":

    stack = Stack()
    print(stack)
    print("스택 내 데이터 empty: {}".format(stack.isEmpty()))
    print("스택에 0~9 정수를 추가")
    for i in range(10):
        stack.push(i)
    print("스택의 크기: {}".format(stack.size()))
    print("peek: {}".format(stack.peek()))
    print("pop: {}".format(stack.pop()))
    print("peek: {}".format(stack.peek()))
    print("스택 내 데이터 empty: {}".format(stack.isEmpty()))
    print(stack)

 

[]
스택 내 데이터 empty: True
스택에 0~9 정수를 추가
스택의 크기: 10
peek: 9
pop: 9
peek: 8
스택 내 데이터 empty: False
[0, 1, 2, 3, 4, 5, 6, 7, 8]

 

노드 객체를 이용한 스택 클래스 구현

class Node(object):
    def __init__(self, value=None, pointer=None):
        self.value = value
        self.pointer = pointer

    class Stack(object):
        def __init__(self):
            self.head = None # 스택 인스턴스에 아무런 데이터도 저장되어 있지 않으므로 초기 head는 None
            self.count = 0

        def isEmpty(self):
            return not bool(self.head)

        def push(self, item):
            self.head = Node(item, self.head)
            self.count += 1

        def pop(self):
            if self.count > 0 and self.head:
                node = self.head
                self.head = node.pointer
                self.count -= 1
                return node.value
            else:
                print("Stack is empty.")

        def peek(self):
            if self.count > 0 and self.head:
                return self.head.value
            else:
                print("Stack is empty.")

        def size(self):
            return self.count

        def _printList(self):
            node = self.head
            while node:
                print(node.value, end=" ")
                node = node.pointer
                print()


if __name__ == "__main__":
    stack = Stack()
    print("스택 내 데이터 empty: {}".format(stack.isEmpty()))
    print("스택에 숫자 0~9 추가")
    for i in range(10):
        stack.push(i)
    stack._printList()
    print("스택 크기: {}".format(stack.size()))
    print("peek: {}".format(stack.peek()))
    print("pop: {}".format(stack.pop()))
    print("peek: {}".format(stack.peek()))
    print("스택 내 데이터 empty: {}".format(stack.isEmpty()))
    stack._printList()

 

스택 내 데이터 empty: True
스택에 숫자 0~9 추가
9 8 7 6 5 4 3 2 1 0 
스택 크기: 10
peek: 9
pop: 9
peek: 8
스택 내 데이터 empty: False
8 7 6 5 4 3 2 1 0