Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Structure Stack
memPtr.l
*curPtr.LONG
EndStructure
;Damit wird ein Stack angelegt. size.l gibt die Anzahl der ablegbaren Integerwerte an
Procedure StackInit(size.l)
*x.Stack = AllocateMemory(SizeOf(Stack))
*x\memPtr = AllocateMemory(size * 4)
*x\curPtr = *x\memPtr
ProcedureReturn *x
EndProcedure
;holt den letzten Wert des Stacks und löscht ihn
Procedure StackPop(*stack.Stack)
*stack\curPtr - 4
ProcedureReturn *stack\curPtr\l
EndProcedure
;ermittelt den letzten Wert des Stacks ohne ihn jedoch zu löschen
Procedure StackGet(*stack.Stack)
ProcedureReturn *stack\curPtr\l
EndProcedure
;Legt einen Wert auf dem Stack ab
Procedure StackPush(*stack.Stack, val.l)
*stack\curPtr\l = val
*stack\curPtr + 4
EndProcedure
;gibt die Resourcen eines Stacks wieder frei
Procedure StackFree(*stack.Stack)
If *stack\memPtr
FreeMemory(*stack\memPtr)
FreeMemory(*stack)
EndIf
EndProcedure
;überprüft ob noch Werte im Stack vorhanden sind
Procedure StackIsEmpty(*stack.Stack)
If *stack\memPtr = *stack\curPtr
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
; Beispiel
*a.Stack = StackInit(50)
*b.Stack = StackInit(50)
StackPush(*a, 12)
StackPush(*a, 23)
StackPush(*b, 67)
Debug StackPop(*a)
Debug StackPop(*b)
StackPush(*a, 42)
Debug StackPop(*a)
Debug StackPop(*a)
Ihr dürft das ruhig noch etwas optimieren und hier dann posten
Beginne jeden Tag als ob es Absicht wäre! BILDblog
Ach shit , deine variante ist 4 Mal schneller !
Aber ich denke, dass meine Flexibler ist (man achte besonders darauf, das man stacks in stacks bauen kann), wozu das gut sein soll, weiß ich auch nicht.
Und ja, meins erweitert den Speicher automatisch !
Man kann auch belibig viele stacks anlegen
Gut, dein's ist schneller, aber meins ein Krümelchen Praktischer ?
Meine Version ist halt für Fälle ausgelegt, in denen bekannt ist wieviele Werte maximal abgelegt werden, also z.B. beim Parsen eines Stringes wofür ich das dann auch benötige.
Ich könnte jetzt hingehen und meine Variante genauso flexibel machen wie deine (aber ohne LL), würde dadurch dann aber halt auch Geschwindigkeit verlieren. Deswegen fehlen ja auch Sicherheitsabfragen und alles. Es funktioniert wenn man weiß was man tut.
Beginne jeden Tag als ob es Absicht wäre! BILDblog