Manche kennen vlt. aus anderen Sprachen das Stapelkonzept. Ein Stapel ist eine Art Datentyp, der aus Elementen besteht und den man sich wie einen realen Stapel Bücher (FILO) oder eine Murmelbahn (FIFO) vorstellen kann.
FILO (FirstInLastOut):
Spoiler anzeigen
Lege Buch 1 auf den Stapel
Lege Buch 2 auf den Stapel
Lege Buch 3 auf den Stapel
Lege Buch 4 auf den Stapel
Nimm oberstes Buch vom Stapel (Buch 4)
Nimm oberstes Buch vom Stapel (Buch 3)
Lege Buch 5 auf den Stapel
...
FIFO (FirstInFirstOut):
Spoiler anzeigen
Lasse Murmel 1 rollen
Lasse Murmel 2 rollen
Lasse Murmel 3 rollen
Nimm Murmel aus der Auffangstelle (Murmel 1)
Lasse Murmel 4 rollen
Nimm Murmel aus der Auffangstelle (Murmel 2)
...
So, und das ganze habe ich mal mittels Arrays in AutoIt nachempfunden.
Das ganze ist sowohl als Arrayersatz bzw. -heranführung für Einsteiger gedacht (auch wenn es intern Arrays sind), als auch manchmal sonst praktisch, wenn man ähnliche Vorgänge nachbilden möchte und einen die Indizes eines Arrays nicht interessieren.
Funktionen
_Stack_New($firstdata) ; gibt ein eindimensionales Array mit einem Element zurück ($firstdata). Anmerkung: Gibt es eine Möglichkeit, ein leeres Array zu erstellen( Dim $array[0] geht schließlich nicht)
_FIFO_Set($stack, $data) ; fügt Daten zu einem FIFO-Stack hinzu
_FILO_Set($stack, $data) ; selbiges mit FILO, eigentlich identisch mit _FIFO_Set
_FIFO_Get($stack) ; gibt ein Element zurück (das erste), löscht dieses
_FILO_Get($stack) ; gibt ein Element zurück (das letzte), löscht dieses
_Stack_isBlank($stack) ; gibt an, ob der Stack leer ist
Es besteht eigentlich kein Unterschied zwischen den Stacktypen, d.h., man kann auch auf einen FIFO-Stack _FILO_Get anwenden...
UDF+Beispiel
#include-once
#include <Array.au3>
;Stack.au3
Func _Stack_New($firstdata)
;returns a "stack" (special array)
Local $ret[1]=[$firstdata]
Return $ret
EndFunc
Func _FIFO_Set(ByRef $stack,$data)
;adds data to the Stack
If UBound($stack) < 1 Then Return StringTrimLeft(SetError(1),1) & ""
_ArrayAdd($stack,$data)
EndFunc
Func _FIFO_Get(ByRef $stack)
;returns first unused element
If UBound($stack) < 1 Then Return StringTrimLeft(SetError(1),1) & ""
Local $return=$stack[0]
_ArrayDelete($stack,0)
Return $return
EndFunc
Func _FILO_Set(ByRef $stack,$data)
;adds data to the stack
If UBound($stack) < 1 Then Return StringTrimLeft(SetError(1),1) & ""
_ArrayAdd($stack,$data)
EndFunc
Func _FILO_Get(ByRef $stack)
;returns last unused element
If UBound($stack) < 1 Then Return StringTrimLeft(SetError(1),1) & ""
Local $ret=$stack[Ubound($stack)-1]
_ArrayDelete($stack,Ubound($stack)-1)
Return $ret
EndFunc
Func _Stack_isBlank(ByRef $stack)
If UBound($stack) < 1 Then Return True
Return False
EndFunc
$newStack=_Stack_New("Eins")
_FIFO_Set($newStack,"Zwei")
_FIFO_Set($newStack,"Drei")
_FIFO_Set($newStack,"Vier")
_FIFO_Set($newStack,"Fünf")
_FIFO_Set($newStack,"Sechs")
_FIFO_Set($newStack,"Sieben")
Do
MsgBox(0,"",_FILO_Get($newStack))
Until _Stack_isBlank($stack)