Stack Datenstruktur in C#

Ein Stack (Stapel) ist eine Last-in-First-out-(LIFO) Datenstruktur.
Die Datenstruktur Stack sollte dann verwendet werden, wenn Daten gesammelt werden, jedoch immer nur ein Datenelement aktuell bearbeitet werden darf.

Das aktuelle Element ist dann das einzige, auf welches zugegriffen werden kann. Alle anderen Elemente bleiben im
Hintergrund und werden erst (und dann auch jeweils einzeln) bearbeitet, wenn das aktuelle Element abgearbeitet und vom Stapel entfernt wurde.

Ein Pointer (Zeiger) zeigt intern immer auf das Element, welches (relativ zu den anderen Elementen) als letztes auf den Stapel gelegt wurde.
Ein einfaches “Lösche aus dem Stack” gibt es nicht, ein Element kann aus dem Stack mit Peek() herausgelesen und mit Pop() herausgelesen und zugleich entfernt werden.
Ein Element kann mit Push() auf den Stack gelegt werden.

Stack

Die Funktionsweise des Stack an Hand eines praktischen Beispiels:
Stellen Sie sich einen Stapel Teller vor, welchen sie abwaschen möchten. Sie würden sicherlich beim obersten Teller anfangen, diesen vom Stapel nehmen und abwaschen. Erst dann können Sie den nächsten Teller vom Stapel nehmen.

Beispielhafte Verwendung eines Stack in C#

Ein Stack wird mit der Klasse Stack angelegt. Der Stack benötigt jedoch die Information, von welchem Typ die zu speichernden Daten sein werden, diese werden mit spitzen Klammern angegeben.
Im Beispiel wird ein Stack angelegt, welcher Integer-Werte speichern soll. Dabei wird seine Kapazität auf 15 Elemente beschränkt.

Im Beispiel werden dann die Werte 3, 4, 5 und 6 auf den Stack abgelegt.

[csharp] Stack stack = new Stack(15);

stack.Push(3);
stack.Push(4);
stack.Push(5);
stack.Push(6);
[/csharp]

Die Anweisung zum Abruf des obersten Segments…

[csharp] stack.Peek();
[/csharp]

…hat folgende Ausgabe zur Folge:

6

Mit der Methode Contains() kann geprüft werden, ob der Stack ein Element enthält (dieses muss nicht das oberste sein). Die Stack-Klasse bietet eine Methode ToArray() an, mit der sich alle Elemente des Stack ausgeben lassen.

Eigentlich soll der Stack die Elemente jedoch nicht alle ausgeben können, sondern nur das oberste (bzw. zuletzt eingefügte) Element!

Dennoch ein Beispiel für eine Methode, welche alle Elemente des Stack ausgibt, in dem jedes Element ausgegeben und entfernt und dann auf einen anderen Stack gelegt wird, um dann wieder (nach der Ausgabe aller Elemente) wieder in den ursprünglichen Stack abgelegt zu werden.

[csharp] private void showStackItems(Stack stack)
{
Stack tempStack = new Stack();

while (stack.Count > 0)
{
Console.WriteLine(“Oberster Stackinhalt: ” + stack.Peek().ToString());

tempStack.Push(stack.Pop());
}

while (tempStack.Count > 0)
{
stack.Push(tempStack.Pop());
}
}
[/csharp]