Implementacja Kolejki
Podstawowe operacje wykonywane na kolejce to Enqueue i Dequeue.
Dane są dodawane do kolejki za pomocą metody Enqueue.
Dane są usuwane z kolejki za pomocą metody Dequeue.
Można zajrzeć do elementu, który wyjdzie z kolejki i służy do tego metoda Peek.
Utworzymy teraz naszą własną kolejkę.
Rozpoczniemy od zdefiniowania interface.
namespace MyQueue
{
interface IQueue
{
void Enqueue(object element);
object Dequeue();
object Peek();
bool isEmpty();
bool isFull();
void Display();
}
}
Teraz zaimplementujemy naszą kolejkę.
W części prywatnej klasy muszą się znaleźć:
tablica do zapisu danych, indeksy początku i końca kolejki
oraz rozmiar kolejki.
using System;
namespace MyQueue
{
public class MyQueue : IQueue
{
public object[] elements;
private int startOfQueue;
private int endOfQueue;
private int queueSize;
public MyQueue()
{
startOfQueue = 0;
endOfQueue = 0;
queueSize = 20;
elements = new object[queueSize];
}
public MyQueue(int capacity)
{
startOfQueue = 0;
endOfQueue = 0;
queueSize = capacity;
elements = new object[capacity];
}
private int Increase(int a)
{
return (a + 1) % queueSize;
}
public bool isEmpty()
{
if (startOfQueue == endOfQueue) return true;
return false;
}
public bool isFull()
{
if (Increase(endOfQueue) == startOfQueue) return true;
return false;
}
public void Enqueue(object element)
{
if (isFull())
{
Console.WriteLine("Kolejka jest pełny!");
}
else
{
elements[endOfQueue] = element;
endOfQueue = Increase(endOfQueue);
Console.WriteLine("Element został pomyślnie dodany!");
}
}
public object Dequeue()
{
if (isEmpty())
{
Console.WriteLine("Kolejka jest pusta!");
return "Bez elementów";
}
else
{
object wynik = elements[startOfQueue];
startOfQueue = Increase(startOfQueue);
return wynik;
}
}
public object Peek()
{
if (isEmpty())
{
Console.WriteLine("Kolejka jest pusty!");
return "Bez elementów";
}
else
return elements[startOfQueue];
}
public void Display()
{
if (isEmpty())
Console.WriteLine("Brak elementów do wyświetlenia");
for (int i = startOfQueue; i < endOfQueue; i++)
Console.WriteLine("Element{0}: {1}", (i + 1), elements[i]);
}
}
}
I teraz skorzystamy z naszej kolejki w aplikacji.
using System;
namespace MyQueue
{
class Program
{
static void Main(string[] args)
{
MyQueue queue = new MyQueue();
while (true)
{
int choice = DisplayMenu();
WorkWithAChoice(queue, choice);
BackToMenu();
}
}
private static int DisplayMenu()
{
Console.Clear();
Console.WriteLine("\nKolejka MENU (rozmiar -- 20)");
Console.WriteLine();
Console.WriteLine("1. Dodaj element.");
Console.WriteLine("2. Usuń element.");
Console.WriteLine("3. Zobacz element.");
Console.WriteLine("4. Wyświetl elementy kolejki.");
Console.WriteLine("5. Koniec programu");
Console.WriteLine();
Console.Write("Dokonaj wyboru co chcesz zrobić: ");
int.TryParse(Console.ReadLine(), out int result);
return result;
}
private static void WorkWithAChoice(MyQueue queue, int choice)
{
switch (choice)
{
case 1:
Console.WriteLine("Wpisz element: ");
queue.Enqueue(Console.ReadLine());
break;
case 2:
Console.WriteLine("Element usunięty: {0}", queue.Dequeue());
break;
case 3:
Console.WriteLine("Pierwszy element w kolejce to: {0}", queue.Peek());
break;
case 4:
queue.Display();
break;
case 5:
Environment.Exit(1);
break;
default:
Console.WriteLine("Dokonałeś niewłaściwego wyboru!");
break;
}
}
private static void BackToMenu()
{
Console.WriteLine("Nacisnij Enter aby przejsc do Menu");
Console.ReadKey();
}
}
}