알고리즘
스택, 큐, 덱
비숑주인
2023. 5. 9. 08:50
스택(Stack)
쌓여 있는 책/상자 같은 입출력 구조
후입선출 구조
마지막으로 들어온 데이터가 가장 위에 쌓이게 되고 가장 먼저 나간다.
<예시>
Stack에 A,B,C,D 순서대로 삽입 -> 삭제 연산 진행
입출력
연산은 스택의 맨 위에서만 발생 , 중간에 삽입/삭제 불가
- top (스택 상단) : 스택의 맨 윗 부분, 입출력이 이루어짐
- bottom (스택 하단) : 스택의 바닥 부분
- element (요소) : 스택에 저장되는 데이터
- empty stack (공백 스택) : 요소가 없는 스택 -> 입출력 불가
자료의 출력이 입력의 역순으로 이루어져야 할 경우에 유용
<스택 기본 동작 구현>
class Stack:
def __init__(self):
self.items = [] #데이터 저장을 위한 리스트 준비
def push(self, val):
self.items.append(val)
def pop(self):
try: #pop할 아이템이 없으면
return self.items.pop()
except IndexError: #indexError 발생
print("Stack is empty")
def top(self):
try:
return self.items[-1]
except IndexError:
print("Stack is empty")
def __len__(self): # len()로 호출하면 stack의 item 수 반환
return len(self.items)
def isEmpty(self):
return self.__len__() == 0
큐(Queue)
스택과 반대로 먼저 들어온 데이터가 먼저 나가는 자료구조
선입선출 구조
뒤에서 새로운 데이터 추가 ,앞에서 데이터가 차례로 삭제
스택 vs 큐
스택 - 삽입/삭제가 같은 쪽에서 진행
큐 - 삽입/삭제가 서로 다른쪽에서 진행
<예시>
Queue에 A,B,C,D 순서대로 삽입 -> 삭제 연산 진행
Class Queue:
def __init__(self):
self.items = [] #데이터 저장을 위한 리스트 준비
def enqueue(self, val):
self.items.append(val)
def dequeue(self):
try: #pop할 아이템이 없으면
return self.items.pop(0)
except IndexError: #indexError 발생
print("Queue is empty")
def front(self):
try:
return self.items[0]
except IndexError:
print("Queue is empty")
def __len__(self): # len()로 호출하면 queue의 item 수 반환
return len(self.items)
def isEmpty(self):
return len(self)
원형큐
deque.rotate()를 사용해서 리스트 회전하기
리스트 자료형을 deque자료형으로 바꾼후 rotate()함수를 이용하면 된다. 함수안에 음수를 넣게 된다면 왼쪽회전 양수는 오른쪽회전이다.
>>> from collections import deque
>>> test = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> test = deque(test)
>>> test.rotate(2)
>>> result = list(test)
>>> result
[8, 9, 1, 2, 3, 4, 5, 6, 7]
위 결과를 보게되면 rotate(2)를 함으로 오른쪽으로 2만큼 회전한것을 볼 수 있다.
덱(Dequeue)
두 가지 자료구조(스택 & 큐)의 기능을 합쳐놓은 자료구조
스택과 큐의 연산을 모두 지원하는 자료구조
왼쪽과 오른쪽 양쪽에서 삽입/삭제 가능
<파이썬 - collections 모듈의 deque 클래스 >
>>>from collections import deque
>>>d = deque('ghi') #deque 생성
>>>d.append('j') #오른쪽에 j 삽입
>>>d.appendleft('f') #왼쪽에 f 삽입
>>>d
deque(['f','g','h','i','j'])
>>>d.pop() #가장 오른쪽 값 가져오기
‘j’
>>>d.popleft() #가장 왼쪽 값 가져오기
'f'
>>>list(d) #리스트로 변환
[‘g’,’h’,’i’]