# C/C++ 로 배우는 자료구조론 연습문제 7.32

class CircularQueue

  def initialize(size)
    @memory = []
    @front = 0
    @rear = 0

    @queue_size = size
  end

  def is_empty
    return @front == @rear
  end

  def is_full
    return ((@rear + 1) % @queue_size) == @front
  end

  def enqueue(data)
    return nil if is_full

    @rear = (@rear + 1) % @queue_size
    @memory[@rear] = data
  end

  def dequeue
    return nil if is_empty
    
    @front = (@front + 1) % @queue_size
    return @memory[@front]
  end
end

def copy_queue(queue_src, queue_dest)
  until queue_dest.is_empty
    queue_dest.dequeue
  end
  
  temp_queue = CircularQueue.new 6
  
  until queue_src.is_empty
    data = queue_src.dequeue
	
	queue_dest.enqueue data
	temp_queue.enqueue data
  end
  
  until temp_queue.is_empty
    queue_src.enqueue temp_queue.dequeue
  end
end

queue = CircularQueue.new 6
queue.enqueue "A"
queue.enqueue "B"
queue.enqueue "C"
queue.enqueue "D"
queue.enqueue "E"

queue2 = CircularQueue.new 6
queue2.enqueue "F"

copy_queue queue, queue2
puts queue2.dequeue
puts queue2.dequeue
puts queue2.dequeue
puts queue2.dequeue
puts queue2.dequeue
puts queue2.dequeue
puts queue.dequeue
puts queue.dequeue
puts queue.dequeue
puts queue.dequeue
puts queue.dequeue
puts queue.dequeue

