Collections Data Structure C#

using System;
public class Stack {
  private int[] data;
  private int size;
  private int top = -1;
  public Stack() { 
    size = 10;
    data = new int[size];
  }
  public Stack(int size) {
    this.size = size;
    data = new int[size];
  }       
  public bool IsEmpty() {
    return top == -1;
  }
  public bool IsFull() {
    return top == size - 1;
  }
  public void Push(int i){
    if (IsFull())
      throw new ApplicationException("Stack full");
    else
      data[++top] = i;
  }
  public int Pop(){
    if (IsEmpty())
       throw new StackEmptyException("Stack empty");
    else
       return data[top--];
  }
  public int Top(){
    if (IsEmpty()) 
      throw new StackEmptyException("Stack empty");
    else
      return data[top];
  }
  public static void Main() {
    try {
      Stack stack1 = new Stack(); 
      stack1.Push(4);
      stack1.Push(5);
      Console.WriteLine("The top is now {0}", stack1.Top());
      stack1.Push(6);
      Console.WriteLine("Popping stack returns {0}", stack1.Pop());
      Console.WriteLine("Stack 1 has size {0}", stack1.size);
      Console.WriteLine("Stack 1 empty? {0}", stack1.IsEmpty());
      stack1.Pop();
      Console.WriteLine("Throws exception before we get here");
    }catch(Exception e) {
        Console.WriteLine(e);
    }
  }
}
class StackEmptyException : ApplicationException {
  public StackEmptyException(String message) : base(message) {
  }
}