using System.Collections.Generic;
namespace GenericStackImplementation
static void Main(string[] args)
StackImplementation<Car> myStackImp = new StackImplementation<Car>();
string[] Models = {"Toyota", "Honda", "Nissan", "Jeep", "BMW", "Mercedes", "Jaguar", "Ford", "Laborghini", "Ferrari"};
static void OperationCompleted(object sender, bool operation)
Console.WriteLine("Item " + (operation ? "Added" : "Removed"));
#region Registering Event Handlers
myStackImp.ProcessCompleted += OperationCompleted;
for (int i = 0; i < 5; i++)
myCar = new Car(rnd.Next(2000, 2022), Models[rnd.Next(0, 10)].ToString(), rnd.Next(150, 220));
Console.WriteLine("---------------------------");
Console.WriteLine("Printing the data in Stack");
Console.WriteLine("---------------------------");
myCar = new Car(rnd.Next(2000, 2022), Models[rnd.Next(0, 10)].ToString(), rnd.Next(150, 220));
Console.WriteLine("Since stack is LIFO, the new item will be added to the end");
Console.WriteLine("Printing the updated data");
Console.WriteLine("---------------------------");
Console.WriteLine("Since stack is LIFO, the last item will be removed");
Console.WriteLine("Printing the updated data");
Console.WriteLine("---------------------------");
public class StackImplementation<T>
private readonly List<T> myList;
public event EventHandler<bool> ProcessCompleted;
public StackImplementation()
public void Push(T pushItem)
OnProcessCompletion(true);
int count = myList.Count;
myList.RemoveAt(count - 1);
OnProcessCompletion(false);
foreach (var item in myList)
protected virtual void OnProcessCompletion(bool operation)
ProcessCompleted?.Invoke(this, operation);
public Car(int year, string model, int maxspeed)
this.Maxspeed = maxspeed;
public override string ToString()
return $"Year -{Year} Model -{Model} Max Speed -{Maxspeed}";