Das ist Definitionssache und hängt vom Blickpunkt ab! Ich selbst würde auch eher Previous nehmen.Mok hat geschrieben:Das Previous kann nicht existieren, weil es im Stack nur ein Next gibt (FILO)
Hier nun doch ein Beispiel ohne Next/Prev ... mit einer PureBasic List:
Code: Alles auswählen
EnableExplicit
Structure tStack
List *Items()
EndStructure
Procedure InitStack()
Protected *NewStack.tStack
*NewStack = AllocateMemory( SizeOf(tStack) )
If *NewStack
InitializeStructure( *NewStack, tStack )
EndIf
ProcedureReturn *NewStack
EndProcedure
Procedure CountStack(*Stack.tStack)
If *Stack
ProcedureReturn ListSize( *Stack\Items() )
Else
ProcedureReturn #Null
EndIf
EndProcedure
Procedure Push(*Stack.tStack, *Value)
Protected *NewStackItem
If Not *Stack : ProcedureReturn #False : EndIf
With *Stack
LastElement( \Items() )
*NewStackItem = AddElement( \Items() )
If *NewStackItem
\Items() = *Value
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndWith
EndProcedure
Procedure Pop(*Stack.tStack)
Protected *LastItem
Protected *Value
If Not *Stack : ProcedureReturn #Null : EndIf
With *Stack
*LastItem = LastElement( \Items() )
If *LastItem
*Value = \Items()
DeleteElement ( \Items() )
Else
*Value = #Null
EndIf
EndWith
ProcedureReturn *Value
EndProcedure
Procedure ClearStack(*Stack.tStack)
Protected *Item
If Not *Stack : ProcedureReturn #False : EndIf
ClearList( *Stack\Items() )
ProcedureReturn #True
EndProcedure
Procedure FreeStack(*Stack.tStack)
If ClearStack( *Stack )
ClearStructure( *Stack, tStack )
FreeMemory( *Stack )
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Define.tStack *MyStack = InitStack()
Define.i Item1 = 5
Define.i Item2 = 20
If *MyStack
Debug Push(*MyStack,@Item1) ; Rückgabewert ist 1 => Aufruf OK
Debug "---"
Debug @Item1 ; Zum Test die Adresse von Item1
Debug Pop(*MyStack) ; Rückgabewert ist eine Adresse => OK, wenn beide Adressen identisch!
Debug "---"
Debug CountStack(*MyStack) ; Gibt Null zurück, da keine Elemente mehr auf dem Stack
Debug Push(*MyStack,@Item1) ; Item1 auf den Stack, gibt #True (1) zurück!
Debug Push(*MyStack,@Item2) ; Item2 auf den Stack, gibt #True (1) zurück!
Debug CountStack(*MyStack) ; Gibt 2 zurück ==> zwei Elemente auf dem Stack
Debug "---"
Debug ClearStack(*MyStack) ; Aufruf OK, gibt #True (1) zurück!
Debug CountStack(*MyStack) ; Gibt 0 zurück ==> keine Elemente mehr auf dem Stack
Debug "---"
Debug Push(*MyStack,@Item1) ; Adresse von Item1 auf den Stack, gibt #True (1) zurück!
Debug Push(*MyStack,@Item2) ; Adresse von Item2 auf den Stack, gibt #True (1) zurück!
Debug PeekI( pop(*MyStack) ) ; Gibt 20 zurück (Item2)
Debug PeekI( pop(*MyStack) ) ; Gibt 5 zurück (Item1)
Debug CountStack(*MyStack) ; Gibt 0 zurück ==> keine Elemente mehr auf dem Stack
Debug "---"
For Item1 = 1 To 10
Debug "Push " + Str(Item1)
Push(*MyStack, Item1)
Next
While CountStack(*MyStack)
Item1 = Pop(*MyStack)
Debug "Pop " + Str(Item1)
Wend
FreeStack( *MyStack ) : *MyStack = #Null
Else
Debug "Stack konnte nicht initialisiert werden"
EndIf
Code: Alles auswählen
If Not CountStack(*MyStack)
; Stack ist leer!
EndIf
cu, guido