Computer Science/자료구조

[5.12] 04-2 큐

토마토. 2021. 5. 13. 14:06

04-1 스택

스택 프로그램 나머지

꼼꼼하게 공부할 것!

from enum import Enum
from class_making import FixedStack

Menu = Enum('Menu', ['푸시', '팝', '피크', '검색', '덤프', '종료'])

enum : enumeration 열거형 - 고유한 상숫값에 연결된 기호 이름의 집합

이 코드에서는 enum 모듈에서 Enum을 호출했다. 

class enum.Enum : 열거형 상수를 만들기 위한 베이직 클래스

#print(*myList, sep='\n')
#리스트를 프린트하는 법
def select_menu() -> Menu:
    s = [f'({m.value}{m.name}' for m in Menu]
    while True:
        print(*s, sep = '   ', end = '')
        n = int(input(': '))
        if 1 <= n <= len(Menu):
            return Menu(n)

print(*myList, sep = '\n') 이렇게 하면 리스트 출력할 수 있다. 

이 코드에서는 리스트 s = [f'({m.value}{m.name)' for m in Menu] 를 구성한 뒤에

공백으로 띄운다. 

from enum import Enum
from class_making import FixedStack

Menu = Enum('Menu', ['푸시', '팝', '피크', '검색', '덤프', '종료'])

def select_menu() -> Menu:
    s = [f'({m.value}{m.name}' for m in Menu]
    while True:
        print(*s, sep = '   ', end = '')
        n = int(input(': '))
        if 1 <= n <= len(Menu):
            return Menu(n)

s = FixedStack(64) #capacity 64

while True:
    print(f'현재 데이터 개수 : {len(s)} / {s.capacity}')
    menu = select_menu()

    if menu == Menu.푸시:
        x = int(input('데이터를 입력하세요: '))
        try:
            s.push(x)
        except FixedStack.Full:
            print('스택이 가득 차 있습니다.')
    elif menu == Menu.팝:
        try:
            x = s.pop()
            print(f'팝한 데이터는 {x}입니다.')
        except FixedStack.Empty:
            print('스택이 비어있습니다.')
    elif menu == Menu.피크:
        try:
            x = s.peek()
            print(f'피크한 데이터는 {x}입니다.')
        except FixedStack.Empty:
            print('스택이 비어있습니다.')
    elif menu == Menu.검색:
        x = int(input('검색할 값을 입력하세요 : '))
        if x in s:
            print(f'{s.count(x)}개 포함되고, 맨 앞의 위치는 {s.find(x)}입니다.')
        else:
            print('검색값을 찾을 수 없습니다.')
    elif menu == Menu.덤프:
        s.dump()
    else:
        break

collections.deque 로 스택 구현하기

- collections.deque로 덱deque를 구현한다. 맨앞/맨끝 양쪽에서 추가/삭제하는 자료구조

- deque 자료구조로 스택을 구현함

from typing import Any
from collections import deque

class Stack: 
    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:
        self.__stk.append(value)
    
    def pop(self) -> Any:
        return self.__stk.pop()
    
    def peek(self) -> Any:
        return self.__stk[-1]
    
    def clear(self) -> None:
        self.__stk.clear()
    
    def find(self, value: Any) -> Any:
        try:
            return self.__stk.index(value)
        except ValueError:
            return -1
    
    def count(self, value: Any) -> int:
        return self.__stk.count(value)

    def __contains__(self, value: Any) -> bool:
        return self.count(value)

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

사용하는 프로그램

# [Do it! 4C-1] 고정 길이 스택 클래스(collections.deque)를 사용하기

from enum import Enum
from stack import Stack

Menu = Enum('Menu', ['푸시', '팝', '피크', '검색', '덤프', '종료'])

def select_menu() -> Menu:
    """메뉴 선택"""
    s = [f'({m.value}){m.name}' for m in Menu]
    while True:
        print(*s, sep='  ', end='')
        n = int(input(':'))
        if 1 <= n <= len(Menu):
            return Menu(n)

s = Stack(64)  # 최대 64 개를 푸시할 수 있는 스택

while True:
    print(f'현재 데이터 개수:{len(s)} / {s.capacity}')
    menu = select_menu()  # 메뉴 선택

    if menu == Menu.푸시:  # 푸시
        x = int(input('데이터:'))
        try:
            s.push(x)
        except IndexError:
            print('스택이 가득 찼습니다.')

    elif menu == Menu.팝:  # 팝
        try:
            x = s.pop()
            print(f'팝한 데이터는 {x}입니다.')
        except IndexError:
           print('스택이 비어 있습니다.')

    elif menu == Menu.피크:  # 피크
        try:
            x = s.peek()
            print(f'피크한 데이터는 {x}입니다.')
        except IndexError:
           print('스택이 비어 있습니다.')

    elif menu == Menu.검색:  # 검색
        x = int(input('검색 값을 입력하세요:'))
        if x in s:
            print(f'{s.count(x)} 개를 포함하고, 맨 앞쪽의 위치는 {s.find(x)}입니다.')
        else:
            print('검색 값은 포함되어 있지 않습니다.')
            
    elif menu == Menu.덤프:  # 덤프
        s.dump()

    else:
        break

04-2 큐

큐 queue : 데이터를 임시 저장하는 자료구조

 

큐 알아보기

큐는 선입선출 FIFO (스택은 후입선출 LIFO)

인큐 enqueue, 디큐 dequeue, 프런트 front, 리어 rear

 

배열로 큐 구현하기

큐는 마트 계산대 줄을 생각하면 된다~ FIFO

 

cf) 우선순위 큐

priority queue 우선순위 큐 : 데이터에 우선순위를 부여하여 추가 / 꺼내는 방식