@ Queue - in Ruby
일반 큐를 배열로 구현하면 자료가 들어가고 나감에 따라 앞부분의 공간을 못쓰게 되는 단점이 있다. 이를 개선한 게 원형(환형) 큐이다.

환형 큐는 큐의 맨 앞과 맨 끝이 붙어 있는 모양이며, 맨 끝에서 맨 앞으로 가는 경우의 인덱스를 계산하기 위해 front / rear 전진 시에 mod(나머지) 를 사용한다.

특이사항은, 큐가 빈 상태와 꽉 찬 상태를 구분하기 위해 front 가 가리키는 자리를 비워놓고 쓴다는 것이다. 이렇게 함으로써 front 와 rear 가 같을 경우 빈 상태, rear 바로 앞에 front 가 있으면 꽉 찬 상태로 인식할 수 있다.


# Circular Queue Implementation
# Jungtaek Lim(Heart), 2009-03-03

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

queue = CircularQueue.new(4)

puts queue.enqueue("Data1")
puts queue.enqueue("Data2")
puts queue.enqueue("Data3")
puts queue.enqueue("Data4")
puts queue.dequeue
puts queue.dequeue
puts queue.dequeue
puts queue.dequeue


결과>
Data1
Data2
Data3
nil
Data1
Data2
Data3
nil
크리에이티브 커먼즈 라이선스
Creative Commons License

'Dev.Programming > DS/Algorithm' 카테고리의 다른 글

Binary Tree - in Ruby  (0) 2009/03/04
Deck(Deque, Double-ended Queue) - in Ruby  (0) 2009/03/04
Circular Queue - in Ruby  (0) 2009/03/04
Queue - in Ruby  (4) 2009/03/04
Stack - in Ruby  (0) 2009/03/03
간단한 문제...(연속된 숫자 그룹 맺어주기)  (0) 2008/09/23
Posted by Heart