private class StackItem<TItem>
public StackItem<TItem> next;
public StackItem(TItem data){
private StackItem<T> top;
public virtual void Push(T data)
var newItem = new StackItem<T>(data);
if (top == null) throw new Exception();
if (top == null) throw new Exception();
public class StackExtended : Stack<int>
private Stack<int> minStack = new Stack<int>();
public override void Push(int data)
if (minStack.IsEmpty() || minStack.Peek() >= data)
public override int Pop()
if (!minStack.IsEmpty() && popped == minStack.Peek())
if (minStack.IsEmpty()) return -1;
public static void Main()
var stack = new StackExtended();
Console.WriteLine("MIN: " + stack.Min());
Console.WriteLine(stack.Pop());