한쪽에서만 데이터를 삽입/삭제 할 수 있는 자료구조이다. 후입선출(Last In First Out, LIFO) 원칙에 따라 자료를 관리한다.
Java에서는 라이브러리로 Stack을 사용할 수 있지만, 파이썬에서는 List가 Stack의 역할을 대신 하므로 별도의 구현 없이 사용 할 수 있다.
파이썬에서는 List의 append로 push를 대신하고, pop은 그대로 사용 할 수 있다. peek은 List의 마지막 index를 의미하는 list[-1]을 사용하면 된다.
Queue는 사전적으로 "줄을 서다"를 의미합니다.
줄을 서서 기다리는 것처럼 먼저 들어오면 데이터가 먼저 나가는 형식입니다.
일명 FIFO(First In First Out) 방식입니다. 큐에서 원소가 추가되는 쪽을 rear, 원소가 출력되고 삭제되는 쪽을 front라고 합니다.
스택과 마찬가지로 list로 queue를 구현 할 수 있지만, list의 경우 pop(0)으로 front의 원소를 출력/삭제 한다면 O(n)의 시간이 걸려서 성능상으로 좋지 않습니다.
queue모듈의 Queue 클래스를 활용해서 큐를 사용 할 수 있습니다. put() 메소드로 원소추가 , get() 메소드로 원소를 삭제 할 수 있습니다.
from queue import Queue
a = Queue()
a.put(1)
a.put(2)
a.put(3)
a.put(4)
print(a.queue) # 큐의 전체 원소확인
print(a.queue[0]) # 큐의 front 값 확인
print(a.queue[-1]) # 큐의 rear 값 확인
print(a.qsize()) # 큐의 size 확인
print(a.empty()) # 큐 비었는지 확인
print(a.get()) # front 원소 삭제
print(a.empty()) # rear에 값 추가
print('===============')
>>> 출력결과
deque([1, 2, 3, 4])
1
4
4
False
1
False
===============
class Queue:
def __init__(self, mx=10000):
self.dat = [0] * mx
self.head = 0
self.tail = 0
def push(self, num): # 큐 원소 추가
self.dat[self.tail] = num
self.tail += 1
def pop(self): # 큐의 맨 앞원소 삭제 및 값 반환 , 여기서는 큐가 비었을시 None으로 예외처리함
if self.head == self.tail:
return None
self.head += 1
return self.dat[self.head - 1]
def isEmpty(self): # 큐가 비었는지 확인
return self.tail - self.head == 0
def size(self): # 큐의 사이즈 확인
return self.tail - self.head
def front(self): # 맨 앞 원소 확인 , 여기서는 큐가 비었을시 None으로 예외처리함
if self.head == self.tail: return None
return self.dat[self.head]
def rear(self): # 맨 뒤 원소 확인 , 여기서는 큐가 비었을시 None으로 예외처리함
if self.head == self.tail: return None
return self.dat[self.tail - 1]