ラボ
リングバッファ †
※「リングバッファ」という名前のデータ構造ではない。
リングバッファとは、要素を円形に並べた構造のこと。言い換えると、リスト(配列など)の、「末尾の次」が先頭になるようにしたもののこと。
例えば、要素数が 4 の配列なら、(4) は範囲外なので、使用できない。しかし、これをリングバッファにすると、(4) は「末尾の次」なので、(0) と同一のものを指す。
キューをリングバッファにした時の話。
値の追加は末尾に対してだが取り出しという操作があるかどうか分からなかったのでアレンジした。
通常のキューは、待ち行列が満杯で、かつ拡張できないときは、既存の要素を取り出さない限り、新たに要素を追加することができないが、これをリングバッファにすると、先頭の要素を追い出して追加する (実装から言うと、新たな要素が先頭の要素を上書きする)。
普通のキューが古い要素を優先するのに対して、こちらは新しい要素を優先すると言えるかもしれない。
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
-
|
!
-
|
|
|
!
-
|
!
-
|
|
!
|
#module "ring"
#deffunc ring_ini val
mref rslt,64
mref ring,48
mref pval,1024
head=0
tail=0
rslt=pval.2
return
#deffunc dering val
mref rslt,64
mref n,16
if (pval.2=0)|(tail==head){
rslt=1
}
else{
n=ring.head
head=head+1\pval.2
rslt=0
}
return
#deffunc enring int
mref rslt,64
mref n,0
if pval.2=0 : rslt=1 : goto *@f
if(tail+1\pval.2)==head{
head=head+1\pval.2
}
ring.tail=n
tail=tail+1\pval.2
rslt=0
*@
return
#global
randomize
enring 1
if stat : mes "リングバッファに追加できませんでした."
dering a
if stat : mes "リングバッファから取り出せませんでした.\n"
gosub *leftclick
dim ary,5+1
ring_ini ary
mes "リングバッファのサイズ ==> "+stat+"\n"
repeat 3
wait 1
rnd r,100 : enring r
mes "リングバッファに入れた値 ==> "+r
loop
gosub *get
gosub *leftclick
repeat 8
wait 1
rnd r,100 : enring r
mes "リングバッファに入れた値 ==> "+r
loop
gosub *get
stop
*get
mes ""
repeat
wait 1
dering n
if stat{
mes "\nリングバッファから取り出せませんでした.\n"
break
}
mes "リングバッファから取り出した値 ==> "+n
loop
return
*leftclick
mes "左クリックで画面クリア."
repeat
wait 1
stick key,0,1
if key=256 : break
loop
cls
return
|
- うむむむむ・・・。 -- kz3
- キューから引っ張ってきたままの部分をリングバッファに直しました^^; -- kz3
- 「リングバッファ⇒キュー」とは限らない(配列や連結リストなどの場合もある)ので、修整。後、実装例は hsp2.x のままでいいのでしょうか。