Kim Seon Deok
chapter 4-1. 스택 & 덱 본문
스택 : 데이터를 임시 저장할 때 사용하는 자료구조
입력과 출력: 후입선출(LIFO = last in first out)방식 >> 가장 나중에 넣은 데이터를 가장 먼저 꺼낸다
푸시(push) : 스택에 데이터를 넣는 작업
팝(pop) : 스택에서 데이터를 꺼내는 작업
꼭대기(top) : 푸쉬하고 팝하는 윗부분
바닥(bottom) : 아랫부분 >> stk[0]
스택의 크기(capacity) : 스택에 쌓을 수 있는 데이터의 최대 갯수 >> len(stk)
스택 포인터(ptr) : 스택에 쌓여 있는 데이터의 개수를 나타내는 정숫값
-스택이 비어있으면 ptr값은 0, 가득 차 있으면 capacity와 같은 값이 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# 고정 길이 스택 클래스(FixedsStack)를 사용하기
from enum import Enum
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
|
cs |
<clollections.deque로 스택 구현>
파이썬의 내장 컨테이너는 딕셔너리, 리스트, 집합, 튜플 이외에도 여러 컨테이너를 collections 모듈로 제공합니다.
덱 : collection.deque
맨 앞과 맨 끝 양쪽에서 원소를 추가 / 삭제하는 자료구조이다 >> 양방향 대기열, 스택과 큐를 합친 형태
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# 고정 길이 스택 클래스 구현하기(collections.deque를 사용)
from typing import AnyStr
from collections import deque
class Stack:
"""고정 길이 스택 클래스(collections.deque)를 사용"""
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) -> int:
"""스택이 비어 있는지 판단"""
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()
def peek(self) -> Any:
"""스택에서 데이터를 피크"""
return self.__stk[-1]
def clear(self) -> None:
"""스택을 비움"""
self.__stk.clear()
def find(self, value: Any) -> Any:
"""스택에서 value를 찾아 인덱스를 반환(찾지 못하면 -1를 반환)"""
try:
return self.__stk.index(value)
except ValueError:
return -1
def count(self, value: Any) -> int:
"""스택에 포함되어 있는 value의 개수르 반환"""
return self.__stk.count(value)
def __contains__(self,value:Any) -> bool:
"""스택에 value가 포함되어 있는지 판단"""
return self.count(value)
def dump(self) -> int:
"""스택 안에 있는 모든 데이터를 나열(바닥에서 꼭대기 순으로 출력)"""
print(list(self.__stk))
|
cs |
'python > Data Structure' 카테고리의 다른 글
chapter 6 -3 단순 선택 정렬, 6 - 4 단순 삽입 정렬, 6 - 5 셸 정렬 (0) | 2022.01.22 |
---|---|
chapter 6-1 & 2 정렬 알고리즘, 버블 정렬 (0) | 2022.01.21 |
chapter 5 - 2. 재귀 알고리즘 분석 (0) | 2022.01.20 |
chapter 5 - 1. 재귀 알고리즘 (0) | 2022.01.20 |
chapter 4-2. 큐 (0) | 2022.01.20 |
Comments