Csharp/C Sharp/Collections Data Structure/Queue

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Add exception handling to the queue classes

<source lang="csharp"> /* 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); 
   }  
 }     

}


      </source>


A queue class for characters

<source lang="csharp"> /* C# A Beginner"s Guide By Schildt Publisher: Osborne McGraw-Hill ISBN: 0072133295

  • /

// A queue class for characters.

using System;

class Queue {

 // these are now private 
 char[] q; // this array holds the queue   
 int putloc, getloc; // the put and get indices   
  
 // Construct an empty Queue given its size.  
 public Queue(int size) {   
   q = new char[size+1]; // allocate memory for queue   
   putloc = getloc = 0;   
 }   
 
 // Construct a Queue from a Queue.  
 public Queue(Queue ob) {  
   putloc = ob.putloc;  
   getloc = ob.getloc;  
   q = new char[ob.q.Length];  
 
   // copy elements  
   for(int i=getloc+1; i <= putloc; i++)  
     q[i] = ob.q[i];  
 }  
 
 // Construct a Queue with initial values.  
 public Queue(char[] a) {  
   putloc = 0;  
   getloc = 0;  
   q = new char[a.Length+1];  
 
   for(int i = 0; i < a.Length; i++) put(a[i]);  
 }  
     
 // Put a character into the queue.   
 public void put(char ch) {   
   if(putloc==q.Length-1) {   
     Console.WriteLine(" -- Queue is full.");   
     return;   
   }   
      
   putloc++;   
   q[putloc] = ch;   
 }   
  
 // Get a character from the queue.  
 public char get() {   
   if(getloc == putloc) {   
     Console.WriteLine(" -- Queue is empty.");   
     return (char) 0;    
   }   
    
   getloc++;   
   return q[getloc];   
 }   

}

// Demonstrate the Queue class. public class QDemo2 {

 public static void Main() {   
   // construct 10-element empty queue  
   Queue q1 = new Queue(10);   
 
   char[] name = {"T", "o", "m"};   
   // construct queue from array  
   Queue q2 = new Queue(name);   
 
   char ch;   
   int i;   
  
   // put some characters into q1   
   for(i=0; i < 10; i++)   
     q1.put((char) ("A" + i));   
 
   // construct queue from another queue  
   Queue q3 = new Queue(q1);  
 
   // Show the queues.  
   Console.Write("Contents of q1: ");   
   for(i=0; i < 10; i++) {    
     ch = q1.get();   
     Console.Write(ch);   
   }   
  
   Console.WriteLine("\n");   
  
   Console.Write("Contents of q2: ");   
   for(i=0; i < 3; i++) {    
     ch = q2.get();   
     Console.Write(ch);   
   }   
  
   Console.WriteLine("\n");   
  
   Console.Write("Contents of q3: ");   
   for(i=0; i < 10; i++) {    
     ch = q3.get();   
     Console.Write(ch);   
   }   
 }   

}


      </source>


Demonstrate the Queue class

<source lang="csharp"> /* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852

  • /

// Demonstrate the Queue class.

using System; using System.Collections;

public class QueueDemo {

 static void showEnq(Queue q, int a) { 
   q.Enqueue(a); 
   Console.WriteLine("Enqueue(" + a + ")"); 

   Console.Write("queue: "); 
   foreach(int i in q) 
     Console.Write(i + " "); 

   Console.WriteLine();         
 } 

 static void showDeq(Queue q) { 
   Console.Write("Dequeue -> "); 
   int a = (int) q.Dequeue(); 
   Console.WriteLine(a); 

   Console.Write("queue: "); 
   foreach(int i in q) 
     Console.Write(i + " "); 

   Console.WriteLine();         
 } 

 public static void Main() { 
   Queue q = new Queue(); 

   foreach(int i in q) 
     Console.Write(i + " "); 

   Console.WriteLine();         

   showEnq(q, 22); 
   showEnq(q, 65); 
   showEnq(q, 91); 
   showDeq(q); 
   showDeq(q); 
   showDeq(q); 

   try { 
     showDeq(q); 
   } catch (InvalidOperationException) { 
     Console.WriteLine("Queue empty."); 
   } 
 } 

}


      </source>


illustrates the use of a Queue

<source lang="csharp"> /* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110

  • /

/*

 Example11_10.cs illustrates the use of a Queue
  • /

using System; using System.Collections; public class Example11_10 {

 public static void Main()
 {
   // create a Queue object
   Queue myQueue = new Queue();
   // add elements to myQueue using the Enqueue() method
   myQueue.Enqueue("This");
   myQueue.Enqueue("is");
   myQueue.Enqueue("a");
   myQueue.Enqueue("test");
   // display the elements in myQueue
   foreach (string myString in myQueue)
   {
     Console.WriteLine("myString = " + myString);
   }
   // get the number of elements in myQueue using the
   // Count property
   int numElements = myQueue.Count;
   for (int count = 0; count < numElements; count++)
   {
     // examine an element in myQueue using Peek()
     Console.WriteLine("myQueue.Peek() = " +
       myQueue.Peek());
     // remove an element from myQueue using Dequeue()
     Console.WriteLine("myQueue.Dequeue() = " +
       myQueue.Dequeue());
   }
 }

}

      </source>


Implements the queue data type using an array

<source lang="csharp"> using System; public class Queue {

 private int[] data;     
 private int size;       
 private int front = -1; 
 private int back = 0;   
 private int count = 0;
 public Queue() { 
   size = 10;
   data = new int[size];
 }
 
 public Queue(int size) {
   this.size = size;
   data = new int[size];
 }       
 
 public bool IsEmpty() {
   return  count == 0;
 }
 
 public bool IsFull() {
   return count == size;
 }
 
 public void Add(int i){
   if (IsFull())
     throw new ApplicationException("Queue full");
   else {
     count++;
     data[back++ % size] = i;
   }
 }
 public int Remove(){
   if (IsEmpty())
      throw new ApplicationException("Queue empty");
   else {
      count--;
      return data[++front % size];
   }
 }
 public int Head(){
   if (IsEmpty()){
     throw new ApplicationException("Queue empty");
   }
   else
     return data[(front+1) % size];
 }
 public static void Main() {
   try {
     Queue q1 = new Queue();
     q1.Add(4);
     q1.Add(5);
     Console.WriteLine("The front is now {0}", q1.Head());
     q1.Add(6);
     Console.WriteLine("Removing from q1 returns {0}", q1.Remove());
     Console.WriteLine("Queue 1 has size {0}", q1.size);
     Console.WriteLine("Queue 1 empty? {0}", q1.IsEmpty());
     q1.Remove();
     Console.WriteLine("Throws exception before we get here");
   }catch(Exception e) {
       Console.WriteLine(e);
   }
 }

}

      </source>


Put elements into a queue

<source lang="csharp"> using System; using System.Collections; using System.Collections.Generic; using System.Text; class Program {

   static void Main(string[] args) {
       Queue alphabet = new Queue();
       alphabet.Enqueue("A");
       alphabet.Enqueue("B");
       alphabet.Enqueue("C");
       Console.Write("First Iteration: ");
       foreach (string item in alphabet) {
           Console.Write(item);
       }
       Console.WriteLine("\nItem pulled from collection: " +
          alphabet.Dequeue().ToString());
       Console.Write("Second iteration: ");
       foreach (string item in alphabet) {
           Console.Write(item);
       }
   }

}

</source>


Put user-defined objects to Queue collection

<source lang="csharp"> using System; using System.Collections; public class Starter {

   public static void Main() {
       Queue waiting = new Queue();
       waiting.Enqueue(new Customer("B"));
       waiting.Enqueue(new Customer("T"));
       waiting.Enqueue(new Customer("K"));
       waiting.Enqueue(new Customer("S"));
       while (waiting.Count != 0) {
           Customer cust =
               (Customer)waiting.Dequeue();
           Console.WriteLine(cust.Name);
       }
   }
   public class Customer {
       public Customer(string cName) {
           propName = cName;
       }
       private string propName;
       public string Name {
           get {
               return propName;
           }
       }
   }

}

</source>


Queue test

<source lang="csharp"> /* Learning C# by Jesse Liberty Publisher: O"Reilly ISBN: 0596003765

  • /
using System;
using System.Collections;
namespace QueueDemo
{
   public class TesterQueueDemo
   {
      public void Run()
      {
          Queue intQueue = new Queue();
          // populate the array
          for (int i = 0;i<5;i++)
          {
              intQueue.Enqueue(i*5);
          }
          // Display the Queue.
          Console.Write( "intQueue values:\t" );
          DisplayValues( intQueue );
          // Remove an element from the Queue.
          Console.WriteLine(
              "\n(Dequeue)\t{0}", intQueue.Dequeue() );
          // Display the Queue.
          Console.Write( "intQueue values:\t" );
          DisplayValues( intQueue );
          // Remove another element from the queue.
          Console.WriteLine(
              "\n(Dequeue)\t{0}", intQueue.Dequeue() );
          // Display the Queue.
          Console.Write( "intQueue values:\t" );
          DisplayValues( intQueue );
          // View the first element in the
          // Queue but do not remove.
          Console.WriteLine(
              "\n(Peek)   \t{0}", intQueue.Peek() );
          // Display the Queue.
          Console.Write( "intQueue values:\t" );
          DisplayValues( intQueue );
      }
       public static void DisplayValues( IEnumerable myCollection )
       {
           IEnumerator myEnumerator =
               myCollection.GetEnumerator();
           while ( myEnumerator.MoveNext() )
               Console.Write( "{0} ",myEnumerator.Current );
           Console.WriteLine();
       }
      [STAThread]
      static void Main()
      {
         TesterQueueDemo t = new TesterQueueDemo();
         t.Run();
      }
   }
}
          
      </source>