본문 바로가기
IT/알고리즘

알고리즘 - 스택(deque)

by Sungjun_ 2020. 11. 6.

collection 모듈의 deque를 사용하면 간단하게 스택을 구현할 수 있습니다.

 


stack_deque.py

from typing import Any
from _collections import deque

class Stack:

    class Empty(Exception):
        pass

    class Full(Exception):
        pass

    def __init__(self, maxlen: int = 256) -> None:
        self.capacity = maxlen
        self.stk = deque([], maxlen)

    def __len__(self) -> int:
        return len(self.stk)

    def is_empty(self) -> bool:
        return not self.stk

    def is_full(self) -> bool:
        return len(self.stk) == self.__stk.maxlen

    def push(self, value: Any) -> None:
        if self.is_full():
            raise Stack.Full
        self.stk.append(value)

    def pop(self) -> Any:
        if self.is_empty():
            raise Stack.Empty
        return self.stk.pop()

    def peek(self) -> Any:
        return self.stk[-1]

    def find(self, value) -> Any:
        try:
            return self.stk.index(value)
        except ValueError:
            return -1

    def dump(self) -> int:
        print(list(self.stk))

 

먼저 초기화 부분에 차이가 있습니다.

기존에는 self.stk = [None] * capacity 이렇게 했다면

이번에는  self.stk = deque([], maxlen) 이렇게 해줍니다.

 

그리고 is_empty와 is_full에서 리턴 부분에도 변화가 생겼습니다.

push, pop 부분은 List형을 생각하시면 됩니다.

 


stack_deque_test.py

from enum import Enum
from stack_deque import Stack

Menu = Enum('Menu', ['push', 'pop', 'peek', 'find', 'dump', 'exit'])


def select_menu():
    s = [f'({m.value}){m.name}' for m in Menu]
    print(*s, sep= '  ')
    n = int(input('메뉴를 선택하세요.: '))
    if 1 <= n <= len(Menu):
        return Menu(n)

s = Stack(16)

while True:
    print(f'스택의 상태: {len(s)} / {s.capacity}')
    menu = select_menu()

    if menu == Menu.push:
        try:
            x = int(input('추가 할 값을 입력하세요.: '))
            s.push(x)
            print('추가 완료\n')
        except Stack.Full:
            print('스택에 자리가 없습니다.\n')

    elif menu == Menu.pop:
        try:
            pop = s.pop()
            print(f'팝한 값은 {pop}입니다.\n')
        except Stack.Empty:
            print('스택이 비어있습니다.\n')

    elif menu == Menu.peek:
        print(f'가장 위에 값은 {s.peek()}입니다.\n')

    elif menu == Menu.find:
        x = int(input('찾을 값을 입력하세요.: '))
        find = s.find(x)
        if find == -1:
            print('찾는 값이 스택 안에 없습니다.\n')
        else:
            print(f'{x}{find} 위치에 있습니다.\n')

    elif menu == Menu.dump:
        s.dump()
        print('\n')

    else:
        break

 

위 파일은 FixedStack 부분과 차이가 없어서 넘어가겠습니다.

 


결과

 

결과 화면

'IT > 알고리즘' 카테고리의 다른 글

백준 - 1406번  (0) 2020.11.09
백준 - 9012번  (0) 2020.11.07
백준 - 1874번(스택 수열)  (0) 2020.11.04
백준 - 10828번(스택)  (0) 2020.11.04
알고리즘 - 스택(stack)  (0) 2020.11.03

댓글