キュー †
リスト構造の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