Collections Data Structure C#

/*
C# A Beginner's Guide
By Schildt
Publisher: Osborne McGraw-Hill
ISBN: 0072133295
*/
/*  
    Project 10-1 
 
    Add exception handling to the queue classes. 
*/ 
using System; 
// A character queue interface. 
public interface ICharQ {    
  // Put a characer into the queue.    
  void put(char ch); 
 
  // Get a character from the queue.   
  char get(); 
}
 
 
// An exception for queue-full errors. 
class QueueFullException : ApplicationException { 
  public QueueFullException() : base() { } 
  public QueueFullException(string str) : base(str) { } 
 
  public override string ToString() { 
    return "\n" + Message; 
  } 

 
// An exception for queue-empty errors. 
class QueueEmptyException : ApplicationException { 
  public QueueEmptyException() : base() { } 
  public QueueEmptyException(string str) : base(str) { } 
 
  public override string ToString() { 
    return "\n" + Message; 
  } 
}
// A fixed-size queue class for characters that uses exceptions. 
class FixedQueue : ICharQ {     
  char[] q; // this array holds the queue     
  int putloc, getloc; // the put and get indices     
     
  // Construct an empty queue given its size.    
  public FixedQueue(int size) {  
    q = new char[size+1]; // allocate memory for queue     
    putloc = getloc = 0;     
  }     
    
  // Put a character into the queue.     
  public void put(char ch) { 
    if(putloc==q.Length-1)  
      throw new QueueFullException("Max length is " + 
                                    (q.Length-1)); 
         
    putloc++;     
    q[putloc] = ch;     
  }     
     
  // Get a character from the queue.    
  public char get() { 
    if(getloc == putloc)  
      throw new QueueEmptyException(); 
       
    getloc++;     
    return q[getloc];     
  }     
}
// Demonstrate the queue exceptions. 
 
public class QExcDemo {     
  public static void Main() {     
    FixedQueue q = new FixedQueue(10);     
    char ch;     
    int i;     
     
    try {  
      // overrun the queue 
      for(i=0; i < 11; i++) { 
        Console.Write("Attempting to store : " + 
                         (char) ('A' + i)); 
        q.put((char) ('A' + i));     
        Console.WriteLine(" -- OK"); 
      } 
      Console.WriteLine(); 
    } 
    catch (QueueFullException exc) { 
      Console.WriteLine(exc); 
    } 
    Console.WriteLine(); 
    
    try { 
      // over-empty the queue 
      for(i=0; i < 11; i++) {      
        Console.Write("Getting next char: "); 
        ch = q.get();     
        Console.WriteLine(ch);     
      } 
    } 
    catch (QueueEmptyException exc) { 
      Console.WriteLine(exc); 
    }  
  }     
}