02-1 큐란?
02-2 배열로 구현하는 큐
02-3 덱이란?
02-4 상속을 이용한 덱의 구현
02-5 파이썬에서 큐와 덱 사용하기
- array[]: 큐 요소들을 저장할 배열
- capacity: 큐에 저장할 수 있는 요소의 최대 개수
- rear: 맨 마지막(후단) 요소의 위치(인덱스)
- front: 첫 번째(전단) 요소 바로 이전의 위치(인덱스)
- 전단 회전: front <- (front+1) % capacity
- 후단 회전: rear <- (rear+1) % capacity
클래스의 선언과 멤버변수 초기화
class ArrayQueue:
def __init__(self, capacity=10):
self.capcity = capacity
self.array = [None] * capacity
self.front = 0
self.rear = 0
공백 상태와 포화 상태를 검사하는 isEmpty()와 isFull() 연산
def isEmpty(self):
return self.front == self.rear
def isFull(self):
return self.front == (self.rear+1) % self.capacity
새로운 요소 e를 삽입하는 enqueue(e) 연산
def enqueue(self, item):
if not self.isFull():
self.rear = (self.rear + 1) % self.capacity
self.array[self.rear] = item
else: pass
맨 앞의 요소를 삭제하는 dequeue() 연산
def dequeue(self):
if not self.isEmpty():
self.front = (self.front + 1) % self.capacity
return self.array[self.front]
else: pass
맨 앞의 요소를 들여다보는 peek() 연산
def peek(self):
if not self.isEmpty():
return self.array[(self.front + 1) % self.capacity]
else: pass
전체 요소의 수를 구하는 size() 연산
def size(self):
return (self.rear - self.front + self.capacity) % self.capacity
큐의 내용을 출력하는 display() 연산
def display(self, msg):
print(msg, end='=[')
for i in range(self.front+1, self.front+1+self.size()):
print(self.array[i%self.capacity], end=' ')
print("]")
import random
q = ArrayQueue(8)
q.display("초기 상태")
while not q.isFull():
q.enqueue(random.randint(0, 100))
q.display("포화 상태")
print("삭제 순서: ", end='')
while not q.isEmpty():
print(q.dequeue(), end=' ')
print()
def enqueue2(self, item):
self.rear = (self.rear + 1) % self.capacity
self.rear[self.rear] = item
if self.isEmpty():
self.front = (self.front + 1) % self.capacity
q = ArrayQueue(8)
q.display("초기 상태")
for i in range(6):
q.enqueue2(i)
q.display("삽입 0-5")
q.enqueue2(6); q.enqueue2(7)
q.display("삽입 6, 7")
q.enqueue2(8); q.enqueue2(9)
q.display("삽입 8, 9")
q.dequeue(); q.dequeue()
q.display("삭제 x2")
- 전단 회전(반시계 방향): front <- (front-1+capacity) % capacity
- 후단 회전(반시계 방향): rear <- (rear-1+capacity) % capacity
클래스의 상속과 멤버변수 초기화
# ArrayQueue 부모 클래스, CircularDeque 자식 클래스ㅡ
class CircularDeque(ArrayQueue):
def __init__(self, capacity=10):
super().__init__(capacity)
isEmpty(), isFull(), size(), display() 연산
addRear(e), deleteFront(), getFront() 연산
def addRear(self, item): self.enqueue(item)
def delete(self): return self.dequeue()
def getFront(self): return delf.peek()
addFront(e), deleteRear(), getRear() 연산
def addFront(self, item):
if not self.isFull():
self.array[self.front] = item
self.front = (self.front-1+self.capacity) % self.capacity
else: pass
def deleteRear(self):
if not self.isEmpty():
item = self.array[self.rear];
self.rear = (self.rear-1+self.capacity) % self.capacity
else: pass
def getRear(self):
if not self.isEmpty():
return self.array[self.rear]
else: pass
dq = CircularDeque()
for i in range(9):
if i%2==0: dq.addRear(i)
else: dq.addFront(i)
dq.display("홀수는 전단 짝수는 후단 삽입")
for i in range(2): dq.deleteFront()
for i in range(3): dq.deleteRear()
dq.display("전단 삭제 2번, 후단 삭제 3번")
for i in range(9, 14): dq.addFront(i)
dq.display("전단에 9 ~ 13 삽입")
import queue
q = queue.Queue(maxsize=20)
enqueue(), dequeue() = pull(), get()
isEmpty(), isfull() = empty(), full()
peek() = 제공하지 않음
import queue
import random
q = queue.Queue(8)
print(“삽입 순서: “, end=‘’)
while not q.full():
v = random.randint(0, 100)
q.put(v)
print(v, end=‘ ‘)
print()
print(“삭제 순서: “, end=‘’)
while not q.empty():
print(q.get(), end=‘ ‘)
print()
import collections.
dq = collections.deque() # 용량이 무한대인 덱 객체 생성
import collections
dq = collections.deque()
print(“덱은 공백 상태 아님” if dq else “덱은 공백 상태“)
for i in range(9):
if i % 2 == 0: dq.append(i)
else: dq.appendleft(i)
print(“홀수는 전단 짝수는 후단 삽입”, dq)
for i in range(2): dq.popleft()
for i in range(3): dq.pop()
print(“전단 삭제 2번, 후단 삭제 3번“, dq)
for i in range(9, 14): dq.appendleft(i)
print(“전단에 9~13 삽입 ”, dq)
print(“덱은 공백 상태 아님“ if dq else “덱은 공백 상태”)
참인경우 값 if 조건식 else 거짓인경우값
—-
5, 3
def clear()
front = rear
12 15 18
def enqueue(self, e):
S1.append(e)
def dequeue(self):
if len(S2)==0:
while not len(S1)==0:
S2.append(S1.pop())
else: print(S2.pop())
def func(q, n):
if n >= 2:
n1 = q.dequeue()
n2 = q.dequeue()
q.append(n2)
q.append(n1 + n2)