Typ generyczny Stack

Stronę tą wyświetlono już: 292 razy

Wstęp

Typ generyczny Stack jak sama nazwa wskazuje jest typem obiektu, który umożliwia przechowywanie danych w postaci stosu. Stosem nazywa się taki sposób przechowywania danych, w którym dostęp do kolejnych jego elementów jest możliwy dopiero po zdjęciu elementów znajdujących się nad nim. Jest to kolejka typu LIFO ang. last in first out (ostatni wchodzi, ostatni wychodzi), czyli pierwszy element dodany do stosu jest ostatnim, który można zdjąć z niego.

Tworzenie stosu Stack i dodawanie do niego elementów

Kolejnym typem generycznym, który jest dostępny w przestrzeni nazw:

Listing 1
  1. using System.Collections.Generic;

typ kontenera Stack. Utwórzmy czym prędzej obiekt naszego stosu:

Listing 2
  1. var stack = new Stack<int>();

Jak widać jest to klasa szablonowa, w której określa się, jakiego typu dane ma przyjmować dany obiekt. Oto jak do obiektu tej klasy wrzuca się elementy:

Listing 3
  1. stack.Push(10);

Zdejmowanie elementu z stosu wraz z jego zwróceniem

Metoda Pop zdejmuje element z szczytu stosu i zwraca jego wartość:

Listing 4
  1. var stack = new Stack<int>();
  2. stack.Push(10);
  3. stack.Push(20);
  4. Console.WriteLine(stack.Pop().ToString()); // po tej operacji wartość 20 nie będzie już znajdowała się na stosie

Wynik działania:

20

Pobieranie elementu ze stosu bez jego zdejmowania

Metoda Peek zwraca element z szczytu stosu:

Listing 5
  1. var stack = new Stack<int>();
  2. stack.Push(10);
  3. stack.Push(20);
  4. Console.WriteLine(stack.Peek().ToString());

Wynik działania:

20

Usuwanie wszystkich elementów z stosu

Metoda Clear usuwa wszystkie dodane do stosu elementy:

Listing 6
  1. <code>var stack = new Stack<int>();
  2. stack.Push(10);
  3. stack.Push(20);
  4. stack.Clear();

Brak indeksowania i właściwość Count

Stos nie byłby stosem, gdyby można było się do jego elementów dobrać za pomocą indeksowania, a więc nie można odwołać się do danego elementu stosu w sposób inny niż poprzez zdejmowanie kolejnych elementów tegoż stosu. Istnieje jednak właściwość klasy Stack, która podaje ile elementów znajduje się na stosie. Tą właściwością jest Count:

Listing 7
  1. <code>var stack = new Stack<int>();
  2. stack.Push(10);
  3. stack.Push(20);
  4. Console.WriteLine(stack.Count.ToString());

Kopiowanie elementów stosu do tablicy

Metoda ToList zwraca tablicę Array zawierającą elementy stosu:

Listing 8
  1. <code>var stack = new Stack<int>();
  2. stack.Push(10);
  3. stack.Push(20);
  4. stack.Push(15);
  5. var array = stack.ToArray();
  6. foreach(int i in list)
  7. {
  8. Console.WriteLine(i.ToString());
  9. }

Wynik działania:

10
20
15

Kopiowanie elementów stosu do listy

Metoda ToList zwraca listę List zawierającą elementy stosu:

Listing 9
  1. <code>var stack = new Stack<int>();
  2. stack.Push(10);
  3. stack.Push(20);
  4. stack.Push(15);
  5. var list = stack.ToList();
  6. foreach(int i in list)
  7. {
  8. Console.WriteLine(i.ToString());
  9. }

Wynik działania:

10
20
15

Sumowanie elementów stosu

Metoda Sum dla typów prostych umożliwia znalezienie maksymalnej wartości zawartej w stosie:

Listing 10
  1. var stack = new Stack<int>();
  2. stack.Push(10);
  3. stack.Push(20);
  4. stack.Push(15);
  5. Console.WriteLine("Suma: " + stack.Sum().ToString());

Wynik działania:

Suma: 45

Dla prostej klasy Point2D:

Listing 11
  1. public class Point2D{
  2. public double x;
  3. public double y;
  4. public Point2D(double x, double y)
  5. {
  6. this.x = x;
  7. this.y = y;
  8. }
  9. };

Można wykonać sumowanie poszczególnych jej pól w sposób następujący:

Listing 12
  1. var stack = new Stack<Point2D>();
  2. stack.Push(new Point2D(20, 30));
  3. stack.Push(new Point2D(100, 400));
  4. double x_sum = stack.Sum(pkg => pkg.X);
  5. Console.WriteLine(x_sum);
  6. double y_sum = stack.Sum(pkg => pkg.Y);
  7. Console.WriteLine(y_sum);

Wynik działania powyższego kodu:

120
430

Maksymalna wartość liczbowa znajdująca się w stosie

Metoda Max dla typów prostych umożliwia znalezienie maksymalnej wartości zawartej w stosie:

Listing 13
  1. <code>var stack = new Stack<int>();
  2. stack.Push(10);
  3. stack.Push(20);
  4. stack.Push(15);
  5. Console.WriteLine("Maksimum: " + stack.Max().ToString());

Wynik działania:

Maksimum: 20

Minimalna wartość liczbowa znajdująca się w stosie

Metoda Min dla typów prostych umożliwia znalezienie minimalnej wartości zawartej w stosie:

Listing 14
  1. <code>var stack = new Stack<int>();
  2. stack.Push(10);
  3. stack.Push(20);
  4. stack.Push(15);
  5. Console.WriteLine("Minimum: " + stack.Min().ToString());

Wynik działania:

Maksimum: 10

Komentarze