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 우선순위 큐 : 데이터에 우선순위를 부여하여 추가 / 꺼내는 방식
'Computer Science > 자료구조' 카테고리의 다른 글
[5.15] 05-2 재귀 알고리즘 분석 (0) | 2021.05.15 |
---|---|
[5.15] 05 -1 재귀 알고리즘의 기본 (0) | 2021.05.15 |
[5.11] 04 스택과 큐 (1) | 2021.05.11 |
[5.10] * class 보충 학습 (0) | 2021.05.10 |
[5.8] 03 검색 알고리즘 - 해시법 (0) | 2021.05.08 |