Att bygga en stack i C#, forts.
Förord
Den här artikeln bygger vidare på den första artikeln om att bygga en stack i C#. I grunden är det mesta oförändrat men istället för att använda object så kommer vi oss att använda oss av Stack< T >. Vad detta innebär är att när man skapar en instans av stacken så väljer man vilken datatyp man vill jobba med tex, Stack< int > stack = new Stack< int >(); För att kunna åstadkomma detta så krävs några mindre förändringar i koden från förra artikeln:Innehåll
»Relaterade artiklar
» Att bygga en Stack i C#
Koden
namespace Stack
{
using System;
using System.Text;
// Krävs för att kunna använda en ArrayList…
using System.Collections;
// Nyhet: Vi lägger till efter klass deklarationen...
class Stack
{
// Vi byter ut ArrayList mot List...
private List lista = new List();
private int iCurrentIndex = -1;
// Nyhet: Istället för object element använder vi T element...
public void Push(T element)
{
// Ökar värdet på iCurrentIndex med 1…
iCurrentIndex++;
// Lägger till värdet som skickas in i metoden i array listan...
lista.Add(element);
}
// Top() Returnerar nu istället för object....
public T Pop()
{
if (IsEmpty())
{
throw new IndexOutOfRangeException("Stacken är tom!");
}
// Vi lagrar det översta värdet i en tillfällig variabel element av typen ...
T element = lista[iCurrentIndex];
lista[iCurrentIndex] = default(T);
iCurrentIndex--;
return element;
}
// Top() Returnerar nu istället för object....
public T Top()
{
if (IsEmpty())
{
throw new IndexOutOfRangeException("Stacken är tom!");
}
return lista[iCurrentIndex];
}
}
}
Vad som sker här är att vi i klass deklarationen lägger till
Funktionen Push har även den genomlidit en smärre förändring, istället för att använda
oss utav object element som tillåter oss att slänga in vilket värde vi vill så använder
vi T element.
Även Pop och Top har fått sig en liten makeover, dem returnerar nu
Men vaddå T hit å T dit? Vad står T för?
Faktiskt så är det så att vi för tillfället inte vet vad T är, det är något vi bestämmer
när vi ska använda klassen.
Betrakta följande:
namespace Stack
{
using System;
using System.Text;
class Program
{
public static void Main(String[] args)
{
// Skapa en instans av objektet Stack();
Stack stack = new Stack();
// Lägg till några godtyckliga värden
stack.Push(1);
stack.Push(2);
stack.Push(3);
stack.Push(4);
// Skriv ut värdena...
stack.Print();
// Skriv ut det "översta" värdet, kräver WriteLine + ToString()...
Console.WriteLine("\nTop:");
Console.WriteLine(stack.Top().ToString());
// Tabort det "översta" värdet från listan…
Console.WriteLine("\nPop:");
Console.WriteLine(stack.Pop().ToString());
// Skriv ut den "nya" listan
Console.WriteLine("\nHela listan efter Pop()");
stack.Print();
// Vänta på att användaren trycker på någon tangent för att avsluta...
Console.ReadLine();
}
}
}
Se hur vi instansierar klassen Stack, istället för att som vanligt skriva Stack stack = new Stack();
så skriver vi nu Stack
lägga till heltal i våran stack. Vill du hellre lägga till strängar så skulle du istället
skriva Stack
Jag hoppas att mina artiklar om att bygga Stackar i C# har varit till någon hjälp, har ni några frågor
eller om ni har någon kritik så är ni välkommna att skriva en kommentar.
MVH// Patrik Hedman
Simon Dahlbacka
Ok, en Stack är ju bra.. men varför gör du bara en halvfärdig implementation, Pop() och Top() bör också returnera T, sen är det något suboptimalt att använda sej av ArrayList som intern lagringsplats, speciellt för value typer.. ett betydligt bättre val skulle ha varit List. Kort sagt, som den är nu ger den här artikeln inte speciellt mycket mervärde över den förra..
Patrik Hedman
Simon du har givetvis rätt i det du säger och jag har lagt till förändringarna nu, vet inte riktigt vad jag tänkte på när ja skrev ihop artikeln faktiskt...