πŸ–‡οΈμ•Œκ³ λ¦¬μ¦˜ μŠ€ν„°λ”” 3μ£Όμ°¨

μ΅œμ§€μ›Β·2023λ…„ 8μ›” 6일
0

μ•Œκ³ λ¦¬μ¦˜

λͺ©λ‘ 보기
4/7

μŠ€νƒ

: 데이터λ₯Ό μž„μ‹œ μ €μž₯ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 자료ꡬ쑰, λ°μ΄ν„°λŠ” ν›„μž…μ„ μΆœ 방식.
ν‘Έμ‹œ / 팝 / κΌ­λŒ€κΈ° / λ°”λ‹₯ /

  • μŠ€νƒ λ°°μ—΄ stk : ν‘Έμ‹œν•œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒ 본체, listν˜• λ°°μ—΄.
    => μΈλ±μŠ€κ°€ 0 인 μ›μ†Œ= μŠ€νƒμ˜ λ°”λ‹₯
  • μŠ€νƒ 크기 capacity : intν˜•, =len(stk)
  • μŠ€νƒ 포인터 ptr : ν˜„μž¬ μŒ“μΈ 데이터 개수

push() / pop() / peek() / clear() / find() / count() / __contains__() / dump()

# 고정길이 μŠ€νƒ 클래슀(FixedStack) μ‚¬μš©ν•˜κΈ°

form enum import Enum		#enumerate() ν•¨μˆ˜λŠ” 인자둜 λ„˜μ–΄μ˜¨ λͺ©λ‘μ„ κΈ°μ€€μœΌλ‘œ μΈλ±μŠ€μ™€ μ›μ†Œλ₯Ό μ°¨λ‘€λŒ€λ‘œ μ ‘κ·Όν•˜κ²Œ ν•΄μ£ΌλŠ” 반볡자(iterator) 객체λ₯Ό λ°˜ν™˜ν•΄μ£ΌλŠ” ν•¨μˆ˜

from fixed_stack 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)			#μ΅œλŒ€ 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 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜κΈ°

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:
    	"""μŠ€νƒμ— valueλ₯Ό ν‘Έμ‹œ"""
        self.__stk.append(value)
        
    def pop(self) -> Any:
    	"""μŠ€νƒμ—μ„œ 데이터λ₯Ό 팝"""
        return self.__stk.pop()
    
"""μ΄ν•˜ μƒλž΅"""

큐

: μ„ μž…μ„ μΆœ ꡬ쑰
인큐 / 디큐 / ν”„λŸ°νŠΈ(맨 μ•ž)=인덱슀 0 / 리어(맨 끝)

λ°°μ—΄λ‘œ κ΅¬ν˜„ / 링 λ²„νΌλ‘œ κ΅¬ν˜„

λ§λ²„νΌλ‘œ κ΅¬ν˜„

ν”„λŸ°νŠΈ: 맨 μ•ž μ›μ†Œ 인덱슀
리어: 맨 끝 μ›μ†Œ λ°”λ‘œ λ’€ 인덱슀(=λ‹€μŒ μΈνλ˜λŠ” 데이터가 μ €μž₯λ˜λŠ” μœ„μΉ˜)

profile
@JiwonChoi0805

0개의 λŒ“κΈ€