キュー

5月 8th, 2008 admin Posted in Ruby, アルゴリズムとデータ構造, 今日のコード |

今日も「アルゴリズムとデータ構造シリーズ」です。本日は「キュー」について。本当はスタックで逆ポーランド記法の式の計算をする予定でしたが面白くないのでスキップします。(逆ポーランド変換ならトライしますが)

キューとは

キューとは最初に入れたデータを最初に取り出すと言う特徴を持つデータ構造。行列などに例えられる。
「先入れ先出し」「First in first out(FIFO)」などと呼ばれる

キューではデータを入力することを「エンキュー」「push」などと表現し、出力させることを「デキュー」「pop」と表現する。
スタックに比べるとキューはWi○MXのあれとかプリンタのあれとか、そもそもqueueの直訳が待ち行列ですって感じで説明しやすい。

キューのデータ構造を配列で表現しようとするととても大きな配列が必要になるため、適当な大きさの配列の頭とお尻をくっつけて使う「リングバッファ」という方法がよくとられます。
リストを使ってキューを実現すればこの問題は発生しないのですが、今回は勉強なのでリングバッファを使ったキューを実装しました。

コード

RUBY:
  1. #Queue
  2. $KCODE = "SJIS"
  3. QUEUE_EMPTY = -1
  4.  
  5. class Queue
  6.   def initialize(max)
  7.     @queue = Array.new()
  8.     @max = max
  9.     @first = 0
  10.     @last = 0
  11.   end
  12.  
  13.   def enqueue(val)
  14.     if((@last + 1)%@max == @first)
  15.       p "ジョブが満杯です"
  16.     else
  17.       @queue[@last] = val
  18.       @last = (@last+1)%@max
  19.     end
  20.   end
  21.  
  22.   def dequeue()
  23.     ret = nil
  24.     if @first == @last
  25.       return QUEUE_EMPTY
  26.     else
  27.       ret = @queue[@first]
  28.       @first = (@first+1)%@max
  29.       return ret
  30.     end
  31.   end
  32.  
  33.   def print_all()
  34.     i = @first
  35.     while i != @last
  36.       print @queue[i].to_s + " "
  37.       i = (i+1)%@max
  38.     end
  39.     print "\n"
  40.   end
  41. end
  42.  
  43. queue = Queue.new(5)
  44. i = nil
  45. while i != 0 do
  46.   print "現在のキュー\n"
  47.   queue.print_all
  48.   print "コマンドを入力して下さい\n0:終了 1:ジョブをためる 2:ジョブを実行\n"
  49.   i = gets.chomp.to_i
  50.  
  51.   case i
  52.     when 1
  53.       print "ジョブの識別番号(1~1000)を適当に入力してください:"
  54.       j = gets.chomp.to_i
  55.       queue.enqueue(j) if (j>= 1 && j <= 1000)
  56.  
  57.     when 2
  58.       j = queue.dequeue
  59.       if j == QUEUE_EMPTY
  60.         print "ジョブがありません\n"
  61.       else
  62.         print "識別番号" + j.to_s + "のジョブを実行\n"
  63.       end
  64.   end
  65. end

実行画面
queue.gif

まとめ

キューを使うようなプログラムを書いてみたいと思った。キューかっこいい!
あと、BASICみたいなプログラムが書けておもしろかった。

※このシリーズは私がRubyでアルゴリズムとデータ構造を基礎から学ぶ記録です。全体の目次はこちらへ。

One Response to “キュー”

  1. [...] キュー はてなに追加 MyYahoo!に追加 del.icio.usに追加 livedoorClipに追加 8 Responses to “Rubyでアルゴリズムとデータ構造” [...]

Leave a Reply