Jan-Langevad

SortedStack.TXT

Feb 13th, 2026
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | Software | 0 0
  1. \ SortedStack.TXT
  2. 0 [IF]
  3. Kode i Forth til at oprette og bruge en form for "stack"med Max 81 entries
  4. hvor entry position afhænger af tal værdi i entry. m.a.o.
  5. en sorteret liste hvor øverste, d.v s den med laveste adresse i
  6. RAM indeholder entry med laveste indholds værdi.
  7. flere entries kan have samme værdi.
  8. Tages øverste entry den med laveste værdi ud,
  9. skal der peges på den næste i "stakken"
  10.  
  11.  
  12. Her er et enkelt eksempel på en sorteret “stack” i Forth,
  13. implementeret som et array med maks 81 entries (indeks 0..80).
  14. Laveste værdi ligger altid på laveste adresse;
  15. flere entries kan have samme værdi, og “toppen” er altid element 0.
  16. [THEN]
  17.  
  18. \ Grundlæggende datastruktur
  19.  
  20. 81 CONSTANT MAX-ENTRIES
  21.  
  22. CREATE s-array MAX-ENTRIES CELLS ALLOT \ selve feltet
  23. VARIABLE s-count \ antal brugte entries (0..MAX-ENTRIES)
  24.  
  25. \ s-array rummer op til 81 celler, og s-count fortæller hvor
  26. \ mange der aktuelt er i brug (0 betyder tom).
  27.  
  28. \ Hjælpeord til at få adresse på element i (0‑baseret indeks):
  29.  
  30. : s-cell ( i -- addr )
  31. CELLS s-array + ;
  32.  
  33. \ Indsæt værdi sorteret (laveste først)
  34. \ Når vi indsætter en værdi x, finder vi første element der er større end x,
  35. \ skubber resten én plads ned og lægger x ind dér:
  36.  
  37.  
  38. : s-insert ( x -- )
  39. s-count @ MAX-ENTRIES = IF
  40. DROP EXIT \ fuld, ignorer eller håndter fejl
  41. THEN
  42.  
  43. \ find indsætningsposition i (første > x)
  44. s-count @ 0 ?DO
  45. DUP \ x
  46. I s-cell @ \ x a[i]
  47. > IF \ hvis a[i] > x, så indsæt her
  48. DROP I LEAVE
  49. THEN
  50. LOOP \ her ligger indekset i på stakken
  51.  
  52. \ i = indsætningsposition
  53. DUP >R \ gem i på returstack
  54. s-count @ \ s-count i
  55. BEGIN
  56. DUP R@ > \ j > i ?
  57. WHILE
  58. DUP 1- \ j j-1
  59. 2DUP \ j j-1 j j-1
  60. s-cell @ \ j j-1 val
  61. SWAP s-cell ! \ flyt val fra j-1 til j
  62. 1- \ j--
  63. REPEAT
  64. DROP R> \ fjern j, hent i
  65.  
  66. \ læg værdien ind
  67. s-cell ! \ i s-cell ! (x var i DUP’en øverst)
  68.  
  69. \ opdatér count
  70. s-count @ 1+ s-count ! ;
  71.  
  72. \ Brug: 42 s-insert indsætter 42 på korrekt sorteret plads.
  73.  
  74. \ Hent og fjern “øverste” (mindste) entry
  75. \ Øverste entry er altid element 0; når vi tager den ud,
  76. \ skubber vi resten én plads op:
  77.  
  78. : s-pop ( -- x | ) \ returnerer mindste værdi, eller gør intet hvis tom
  79. s-count @ 0= IF
  80. EXIT \ tom
  81. THEN
  82.  
  83. \ tag mindste værdi
  84. 0 s-cell @
  85.  
  86. \ skub resten op
  87. s-count @ 1- 0 ?DO
  88. I 1+ s-cell @
  89. I s-cell !
  90. LOOP
  91.  
  92. \ opdatér count
  93. s-count @ 1- s-count ! ;
  94.  
  95. \ Brug:
  96.  
  97. 10 s-insert
  98. 5 s-insert
  99. 20 s-insert
  100.  
  101. s-pop . \ skriver 5
  102. s-pop . \ skriver 10
  103. s-pop . \ skriver 20
  104.  
Advertisement
Add Comment
Please, Sign In to add comment