キュー  †
リスト構造の1種で値の追加をリストの先頭、取り出しを末尾に対して行うデータ構造。
リングバッファとの違いは、キューがいっぱいの時には要素を追加できない点かな?
|   1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 |  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
!
-
|
|
|
!
 
 
 
 
 
 
 
 
-
|
!
-
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 | 
    #module "queue"
            #deffunc queue_ini val
        mref rslt,64
        mref queue,48               mref pval,1024
        head=0
        tail=0
        rslt=pval.2
        return
            #deffunc dequeue val
        mref rslt,64
        mref n,16
        if pval.2=0 : rslt=1 : goto *@f
        if tail==head{
            rslt=1
        }
        else{
            n=queue.head
            head=head+1\pval.2
            rslt=0
        }
*@
        return
            #deffunc enqueue int
        mref rslt,64
        mref n,0
        if pval.2=0 : rslt=1 : goto *@f
        if(tail+1\pval.2)==head{
            rslt=1
        }
        else{
            queue.tail=n
            tail=tail+1\pval.2
            rslt=0
        }
*@
        return
    #global
    randomize
        enqueue 1
    if stat : mes "キューへ追加できませんでした."
 
    dequeue a
    if stat : mes "キューから取り出せませんでした.\n"
 
        dim ary,5+1
    queue_ini ary               mes "キューのサイズ ==> "+stat+"\n"
 
        repeat
        await 0
        rnd r,100
        enqueue r
        if stat{
            mes "キューへ追加できませんでした.\n"
            break
        }
        mes "キューに入れた値 ==> "+r
    loop
 
        repeat
        await 0
        dequeue n
        if stat{
            mes "キューから取り出せませんでした.\n"
            break
        }
        mes "キューから取り出した値 ==> "+n
    loop
 
    stop
 | 
- 実はこれは配列のサイズ-1が実際に使われるサイズです。
 キューが空かどうかをhead==tailで判断しているので1周したときに見分けが付かないからです。
 他の方法に空かどうかを表すフラグを使うことも考えられますね。 -- kz3
- キューの説明に「レジ」が例えられますよね?
 待ち行列といってお客さんは前の人の後ろ(末尾)に次々に並んで、前(先頭)の人が去ってから次の人の番(取り出される番)になる、と。
 でも、プログラミングのキューとレジのキューを一緒にしちゃダメですよ。
 優先順位付き待ち行列ならまだしも、レジは割込み行列です・・・。愚痴でした;; -- kz3
- ん。何故、キューがpgetでマップ移動なんかに^^;元に戻しました。 -- kz3 
- せっかく上がってきたのでバージョンタイルつけました。 -- kz3