| Um mit UPN effektiv arbeiten zu können, muß man sogenannte Stacks (zu Deutsch „Stapel“) kennen. Ein Stack funktioniert eigentlich ganz einfach: Im Kaufhaus steht ein Stapel voller Konservendosen. Der Stapel kann jederzeit aufgefüllt werden, indem neue Dosen draufgestellt werden. Wenn ein Kunde eine Dose kaufen will, nimmt er sie ebenfalls von ganz oben. Würde er versuchen, sich eine Dose aus der Mitte zu nehmen – na, dann würde der ganze Stapel zusammenstürzen. Und damit kennen wir auch schon das erste und einzige Gesetz der Stacks: Elemente können nur ganz oben abgelegt und auch nur ganz oben entfernt werden (Anmerkung: Wir reden hier von sogenannten FiLo-Stacks. FiLo steht für First in, Last out. Es gibt auch das Gegenteil, nämlich FiFo-Stacks. Hier gilt die Regel First in, First out, was bedeutet, daß man immer nur das Element entfernen kann, was als erstes hineingepackt wurde. Ein Reallife-Äquivalent wäre zum Beispiel ein Kaugummiautomat, der von oben befüllt wird, der Inhalt kommt aber unten wieder hervor). Wenn man an das x-te Element des Stacks will, muß man vorher erst alle x - 1 Elemente darüber herunternehmen. Ansonsten verhält sich ein Stack im Wesentlichen wie ein Array, das heißt er speichert Elemente. Dabei gibt es wie bei Arrays sowohl die statische Variante mit einer festgelegten Anzahl von Elementen, sowie die dynamische Variante, die eben immer genau so groß ist, wie man sie braucht. Einen Stack per VB zu programmieren ist ebenfalls ganz einfach. Folgende Klasse stellt einen Stack zum Speichern von Strings dar. Die Klasse basiert aus Gründen der Geschwindigkeit auf Arrays, man könnte ihn aber ebenfalls auf doppelt verknüpften Listen basieren lassen. Die Klasse braucht nur drei Methoden: eine, die Elemente hinzufügt (Push()), eine zum Entfernen von Elementen (Pop()), sowie eine Methode zum Auslesen des obersten Elements (Peek()). Außerdem gibt es eine Eigenschaft, die die Zahl der Elemente speichert (Count). Option Explicit
Private Const CLASSNAME As String = "CStringStack"
Private m_Stack() As String
Private m_lOffset As Long
Private Sub Class_Initialize()
Call Clear
End Sub
Public Sub Clear()
m_lOffset = 0
Erase m_Stack
ReDim m_Stack(1000) As String
End Sub
Public Sub Push(Item As String)
If m_lOffset > UBound(m_Stack) Then _
ReDim Preserve m_Stack(m_lOffset + 1000) As String
m_Stack(m_lOffset) = Item
m_lOffset = m_lOffset + 1
End Sub
Public Function Pop() As String
If CBool(m_lOffset) Then
m_lOffset = m_lOffset - 1
Pop = m_Stack(m_lOffset)
Else
Call Err.Raise( _
vbObjectError, _
CLASSNAME, _
"Cannot pop from empty stack." _
)
End If
End Function
Public Property Get Peek() As String
If CBool(m_lOffset) Then _
Peek = m_Stack(m_lOffset - 1) _
Else _
Call Err.Raise( _
vbObjectError, _
CLASSNAME, _
"Cannot peek from empty stack." _
)
End Property
Public Property Get Count() As Long
Count = m_lOffset
End Property Listing 1: CStringStack.cls |