Stack UDF (FIFO & FILO)

  • 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
    [autoit]


    _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

    [/autoit]


    Es besteht eigentlich kein Unterschied zwischen den Stacktypen, d.h., man kann auch auf einen FIFO-Stack _FILO_Get anwenden...

    UDF+Beispiel
    [autoit]

    #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)

    [/autoit]

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Ne mensch wollt doch deine Funktion gar nicht schlecht reden.
    Gerade weil es nur mit AutoIt-Mitteln gelöst ist.
    Wollte bloß noch den Hinweis geben das es auch noch andere Möglichkeiten dazu gibt.

    Vielleicht sollte man aber dennoch dazu sagen das es sich zwar nach außen wie ein Stack verhält - intern aber ganz anders aufgebaut ist.
    Weil ein Stack im Vergleich zu einem Array ja dynamisch ist und man dieses nur durch ReDim dynamisch "prügelt".
    Gerade bei großen Strukturen wo viel Elemente hinzugefügt und entfernt werden wird ein richtiger Stack schneller sein als eine Arraylösung.
    Das ist ja der eigentliche Hintergrund warum ich damals den Post mit den Arrayalternativen geschrieben habe.