ν ADT
ν ADTλ μμμ κ°μ²΄λ€μ μ μ₯νλ νλμ μΆμμλ£νμ΄λ€. μ½μ κ³Ό μμ λ μ μ μ μΆ (First In First Out, FIFO)μμλ₯Ό λ°λ₯Έλ€. μ½μ μ νμ λ€(rear)μμ, μμ λ νμ μ(front)μ΄λΌ λΆλ¦¬λ μμΉμμ μνλλ€.
ν ADT λ©μλ
νμ λ©μλλ λ€μκ³Ό κ°λ€.
#μ£Όμ ν λ©μλ
enqueue(element) : νμ λ€μ μμλ₯Ό μ½μ
element dequeue() : νμ μμμ μμλ₯Ό μμ νμ¬ λ°ν
#보쑰 ν λ©μλ
element front() : νμ μμ μλ μμλ₯Ό (μμ νμ§ μκ³ ) λ°ν
integer size() : νμ μ μ₯λ μμμ μλ₯Ό λ°ν
boolean isEmpty() : νκ° λΉμ΄μλμ§ μ¬λΆλ₯Ό λ°ν
iterator elements() : ν μμ μ 체λ₯Ό λ°ν
#μμΈ
EmptyQueueException() : λΉμ΄ μλ νμ λν΄ μμ λλ frontλ₯Ό μν μλν κ²½μ° λ°λ Ή
fullQueueException(): λ§μ νμ λν΄ μ½μ μ μν μλν κ²½μ° λ°λ Ή
μ΄κΈ°ν
μ½μ
μμ
ν ADT ꡬν
νλ λ°°μ΄κ³Ό μ°κ²°λ¦¬μ€νΈλ₯Ό μ΄μ©ν΄ ꡬνν μ μλ€. μ΄λ²μλ μ°κ²°λ¦¬μ€νΈλ₯Ό ν΅ν΄ ꡬνν΄λ³΄κ² λ€.
λ¬Όλ‘ νμ΄μ¬μμ 리μ€νΈλ₯Ό νμ©νλ©΄ μμ½κ² νλ΄λΌ μ μλ€.
class Node:
def __init__(self,data,next=None):
self.data = data
self.next = next
class queue:
def __init__(self):
self.front = None
self.rear = None
self.qsize = 0
def isEmpty(self):
return self.front == None
def printfront(self):
if self.isEmpty():
print("EmptyQueueException")
else:
print(self.front.data)
def quesize(self):
print(self.qsize)
def queprint(self):
if self.isEmpty():
print("EmptyQueueException")
else:
target = self.front
for i in range(self.qsize):
if i == self.qsize-1:
print(target.data)
else:
print(target.data, end =" ")
target = target.next
def enqueue(self, data):
newnode = Node(data)
self.qsize+=1
if self.isEmpty():
self.front = newnode
self.rear = newnode
else:
self.rear.next = newnode
self.rear = newnode
print("Success Enqueue : ",newnode.data)
def dequeue(self):
if self.isEmpty():
print("EmptyQueueException")
else:
self.qsize-=1
elem = self.front.data
p = self.front
self.front = self.front.next
if self.front == None:
self.rear = None
del(p)
print("Success Dequeue : ",elem)
>>> a = queue()
>>> print(a.isEmpty())
True
>>> a.enqueue('1')
Sucess Enqueue : 1
>>> a.enqueue('2')
Sucess Enqueue : 2
>>> print(a.isEmpty())
False
>>> a.quesize()
2
>>> a.printfront()
1
>>> a.queprint()
1 2
>>> a.quesize()
2
>>> a.dequeue()
Sucess Dequeue : 1
>>> a.queprint()
2
λ°ν¬ ADT
λ°ν¬λ λμΌνκ² μμμ κ°μ²΄λ€μ μ μ₯νλ νλμ μΆμμλ£νμ΄λ€. λ°ν¬λ μ€νκ³Ό νκ° ν©μ³μ§ λ°©μμΌλ‘ μλνλ€.
μ½μ κ³Ό μμ μ(front)κ³Ό λ€(rear)μμ λͺ¨λ μ΄λ£¨μ΄ μ§ μ μλ€.
λ°ν¬ ADT λ©μλ
λ°ν¬μ λ©μλλ λ€μκ³Ό κ°λ€.
#μ£Όμ λ°ν¬ λ©μλ
push(e): front μμΉμ μμλ₯Ό μ½μ
element pop(): front μμΉμ μμλ₯Ό μμ νμ¬ λ°ν
inject(e): rear μμΉμ μμλ₯Ό μ½μ
element eject(): rear μμΉμ μμλ₯Ό μμ νμ¬ λ°ν
#보쑰 λ°ν¬ λ©μλ
element front(): front μμΉμ μμλ₯Ό λ°ν
element rear(): rear μμΉμ μμλ₯Ό λ°ν
integer size(): λ°ν¬μ μ μ₯λ μμμ μλ₯Ό λ°ν
boolean isEmpty(): λ°ν¬κ° λΉμ΄ μλμ§ μ¬λΆλ₯Ό λ°ν
#μμΈ
EmptyQueueException() : λΉμ΄ μλ νμ λν΄ μμ λλ frontλ₯Ό μν μλν κ²½μ° λ°λ Ή
fullQueueException(): λ§μ νμ λν΄ μ½μ μ μν μλν κ²½μ° λ°λ Ή
μ΄κΈ°ν
μ½μ
μμ
λ°ν¬ ADT ꡬν
νμ΄μ¬μμ λ°ν¬λ
from collections import deque
λ₯Ό ν΅ν΄ μμ½κ² μ΄μ©μ΄ κ°λ₯νλ€. νμ§λ§ μ£Όμ λ©μλμ 보쑰λ©μλλ₯Ό μ΄μ€μ°κ²°λ¦¬μ€νΈλ₯Ό ν΅ν΄ ꡬνν΄λ³΄κ² λ€.
class Node:
def __init__(self,data,prev = None,next = None):
self.data = data
self.prev = prev
self.next = next
class deque:
def __init__(self):
self.front = None
self.rear = None
self.dqsize = 0
def isEmpty(self):
return self.front == None
def printsize(self):
print(self.dqsize)
def printdeque(self):
if self.isEmpty():
print("EmptyQueueException")
else:
target = self.front
for i in range(self.dqsize):
if i == self.dqsize-1:
print(target.data)
else:
print(target.data, end =" ")
target = target.next
def add_rear(self, data): #inject
newnode = Node(data)
if self.isEmpty():
self.front = newnode
self.rear = newnode
else:
newnode.prev = self.rear
self.rear.next =newnode
self.rear = newnode
self.dqsize +=1
print("Successly add rear :",data)
def add_front(self, data): #push
newnode = Node(data)
if self.isEmpty():
self.front = newnode
self.rear = newnode
else:
newnode.next = self.front
self.front.prev =newnode
self.front = newnode
self.dqsize +=1
print("Successly add front :",data)
def delete_front(self):#pop
if self.isEmpty():
print("EmptyQueueException")
else:
e = self.front.data
p = self.front
self.front = self.front.next
if self.front == None:
self.rear = None
else:
self.front.prev = None
del(p)
self.dqsize -=1
print("Successly delete front :",e)
def delete_rear(self): #eject
if self.isEmpty():
print("EmptyQueueException")
else:
e = self.front.data
p = self.rear
self.rear = self.rear.prev
if self.rear == None:
self.front = None
else:
self.rear.next = None
del(p)
self.dqsize -=1
print("Successly delete rear :",e)
>>> a = deque()
>>> print(a.isEmpty())
True
>>> a.add_rear('a')
Successly add rear : a
>>> a.add_rear('b')
Successly add rear : b
>>> a.printdeque()
a b
>>> a.add_front('B')
Successly add front : B
>>> a.add_front('A')
Successly add front : A
>>> a.printdeque()
A B a b
>>> a.printsize()
4
>>> a.delete_front()
Successly delete front : A
>>> a.delete_rear()
Successly delete rear : B
>>> a.printdeque()
B a
μμ μ΄ μ μ§νλλμ§ νμΈνκΈ° μν΄ μ½κ°μ μΆλ ₯λ¬Έμ λνλ€. λ©μλκ° μ μλνλ κ²μ νμΈν μ μλ€.