hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
ラボ/キュー - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

ラボ

 HSP2.61 

キュー

データ構造

リスト構造の1種で値の追加をリストの先頭、取り出しを末尾に対して行うデータ構造。
リングバッファとの違いは、キューがいっぱいの時には要素を追加できない点かな?

実装例

filequeue[sp].as
Everything is expanded.Everything is shortened.
  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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
!
-
|
|
|
!
 
 
 
 
 
 
 
 
-
|
!
-
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
/******************************************************************************
 *                                                                            *
 *                             データ構造:キュー                             *
 *                                                                            *
 *   リスト構造の1種で値の追加をリストの先頭、取り出しを末尾に対して行う     *
 *   データ構造。                                                             *
 *   リングバッファとともに使われる。                                         *
 *                                                                            *
 ******************************************************************************/
    #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
/* -------------------------------------------------------------------------- *
 *                           S A M P L E                           *
 * -------------------------------------------------------------------------- */
    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 2005-07-22 12:11:47 (金)
  • キューの説明に「レジ」が例えられますよね?
    待ち行列といってお客さんは前の人の後ろ(末尾)に次々に並んで、前(先頭)の人が去ってから次の人の番(取り出される番)になる、と。
    でも、プログラミングのキューとレジのキューを一緒にしちゃダメですよ。
    優先順位付き待ち行列ならまだしも、レジは割込み行列です・・・。愚痴でした;; -- kz3 2005-07-22 12:26:33 (金)
  • ん。何故、キューがpgetでマップ移動なんかに^^;元に戻しました。 -- kz3 2005-12-22 (木) 11:34:07
  • せっかく上がってきたのでバージョンタイルつけました。 -- kz3 2005-12-22 (木) 11:50:40

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
filequeue[sp].as
544件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:42:11 (2436d)