Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
165
Task/Priority-queue/OxygenBasic/priority-queue.basic
Normal file
165
Task/Priority-queue/OxygenBasic/priority-queue.basic
Normal file
|
|
@ -0,0 +1,165 @@
|
|||
'PRIORITY QUEUE WITH 16 LEVELS
|
||||
|
||||
uses console
|
||||
|
||||
% pl 16 'priority levels
|
||||
|
||||
===================
|
||||
Class PriorityQueue
|
||||
===================
|
||||
|
||||
indexbase 1
|
||||
bstring buf[pl] 'buffers to hold priority queues content
|
||||
int bg[pl] 'buffers base offset
|
||||
int i[pl] 'indexers
|
||||
int le[pl] 'length of buffer
|
||||
|
||||
method constructor()
|
||||
====================
|
||||
int p
|
||||
for p=1 to pl
|
||||
buf[p]=""
|
||||
le[p]=0
|
||||
bg[p]=0
|
||||
i=[p]=0
|
||||
next
|
||||
end method
|
||||
|
||||
method destructor()
|
||||
===================
|
||||
int p
|
||||
for p=1 to pl
|
||||
del (buf[p])
|
||||
le[p]=0
|
||||
bg[p]=0
|
||||
i=[p]=0
|
||||
next
|
||||
end method
|
||||
|
||||
method Encodelength(int ls,p)
|
||||
=============================
|
||||
int ll at i[p]+strptr(buf[p])
|
||||
ll=ls
|
||||
i[p]+=sizeof int
|
||||
end method
|
||||
|
||||
method limit(int*p)
|
||||
===================
|
||||
if p>pl
|
||||
p=pl
|
||||
endif
|
||||
if p<1
|
||||
p=1
|
||||
endif
|
||||
end method
|
||||
|
||||
method push(string s,int p)
|
||||
=============================
|
||||
limit p
|
||||
int ls
|
||||
ls=len s
|
||||
if i[p]+ls+8 > le[p] then
|
||||
int e=8000+(ls*2) 'extra buffer bytes
|
||||
buf[p]=buf[p]+nuls e 'extend buf
|
||||
le[p]=len buf[p]
|
||||
end if
|
||||
EncodeLength ls,p 'length of input s
|
||||
mid buf[p],i[p]+1,s 'patch in s
|
||||
i[p]+=ls
|
||||
end method
|
||||
|
||||
|
||||
method popLength(int p) as int
|
||||
==============================
|
||||
if bg[p]>=i[p]
|
||||
return -1 'buffer empty
|
||||
endif
|
||||
int ll at (bg[p]+strptr buf[p])
|
||||
bg[p]+=sizeof int
|
||||
return ll
|
||||
end method
|
||||
|
||||
method pop(string *s, int *p=1, lpl=0) as int
|
||||
=============================================
|
||||
limit p
|
||||
int ls
|
||||
do
|
||||
ls=popLength p
|
||||
if ls=-1
|
||||
if not lpl 'lpl: lock priority level
|
||||
p++ 'try next priority level
|
||||
if p<=pl
|
||||
continue do
|
||||
endif
|
||||
endif
|
||||
s=""
|
||||
return ls 'empty buffers
|
||||
endif
|
||||
exit do
|
||||
loop
|
||||
s=mid buf[p],bg[p]+1,ls
|
||||
bg[p]+=ls
|
||||
'cleanup buffer
|
||||
if bg[p]>1e6 then
|
||||
buf[p]=mid buf[p],bg[p]+1 'remove old popped data
|
||||
le[p]=len buf[p]
|
||||
i[p]-=bg[p] 'shrink buf
|
||||
bg[p]=0
|
||||
end if
|
||||
end method
|
||||
|
||||
method clear()
|
||||
==============
|
||||
constructor
|
||||
end method
|
||||
|
||||
|
||||
end class 'PriorityQueue
|
||||
|
||||
|
||||
'====
|
||||
'DEMO
|
||||
'====
|
||||
new PriorityQueue medo()
|
||||
string s
|
||||
|
||||
def inp
|
||||
medo.push %2,%1
|
||||
end def
|
||||
|
||||
' Priority Task
|
||||
' ══════════ ════════════════
|
||||
inp 3 "Clear drains"
|
||||
inp 4 "Feed cat"
|
||||
inp 5 "Make tea"
|
||||
inp 1 "Solve RC tasks"
|
||||
inp 2 "Tax return"
|
||||
inp 4 "Plant beans"
|
||||
'
|
||||
int er
|
||||
int p
|
||||
print "Priority Task" cr
|
||||
print "=================" cr
|
||||
do
|
||||
er=medo.pop s,p
|
||||
if er=-1
|
||||
print "(buffer empty)"
|
||||
exit do
|
||||
endif
|
||||
print p tab s cr
|
||||
loop
|
||||
pause
|
||||
del medo
|
||||
|
||||
/*
|
||||
RESULTS:
|
||||
Priority Task
|
||||
=================
|
||||
1 Solve RC tasks
|
||||
2 Tax return
|
||||
3 Clear drains
|
||||
4 Feed cat
|
||||
4 Plant beans
|
||||
5 Make tea
|
||||
(buffer empty)
|
||||
*/
|
||||
Loading…
Add table
Add a link
Reference in a new issue