λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

자료ꡬ쑰 및 μ‹€μŠ΅

자료ꡬ쑰 및 μ‹€μŠ΅ - [7] 큐 Queue, 데크 Deque (파이썬으둜 큐,데크 κ΅¬ν˜„) (1)

큐 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

μž‘μ—…μ΄ 잘 μ§„ν–‰λ˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μ•½κ°„μ˜ 좜λ ₯문을 λ”ν–ˆλ‹€. λ©”μ„œλ“œκ°€ 잘 μž‘λ™ν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

728x90