本篇,我们介绍另一种利用线性表创建的一种数据结构 —— 队列(Queues)。
队列在我们日常工作中也经常使用,例如打印机、操作系统等。
Reversing a Queue public  void  ReverseQueue <T >(Queue<T> q ) {     var  s = new  Stack<T>();     while  (q.Count != 0 )     {         s.Push(q.Dequeue());     }     while  (s.Count != 0 )     {         q.Enqueue(s.Pop());     } }
 
使用环形数组来构建队列 public  class  ArrayQueue <T > {     private  class  QueueOverFlowException  : Exception      {}     private  readonly  T[] _queue;     private  int  _count;     private  int  _front;     private  int  _rear;     public  ArrayQueue (int  capacity )     {         _queue = new  T[capacity];     }     public  void  Enqueue (T item )     {         if  (_count == _queue.Length)         {             throw  new  QueueOverFlowException();         }         _queue[_rear] = item;         _rear = (_rear + 1 ) % _queue.Length;         _count++;     }     public  T Dequeue ( )     {         if  (IsEmpty())         {             throw  new  InvalidOperationException();         }         var  item = _queue[_front];         _queue[_front] = default (T);         _front = (_front + 1 ) % _queue.Length;         _count--;         return  item;     }     public  T Peek ( )     {         if  (IsEmpty())         {             throw  new  InvalidOperationException();         }         return  _queue[_front];     }     public  bool  IsEmpty ( )     {         return  _count == 0 ;     }     public  bool  IsFull ( )     {         return  _count == _queue.Length;     }     public  override  string  ToString ( )     {         return  string .Format("[{0}]" , string .Join("," , _queue));     } }
 
使用栈来构建队列 public  class  StackQueue <T > {     private  class  QueueOverFlowException  : Exception      { }     private  Stack<T> _pushStack;     private  Stack<T> _popStack;     public  void  Enqueue (T item )     {         _pushStack.Push(item);     }     public  T Dequeue ( )     {         if  (IsEmpty())         {             throw  new  QueueOverFlowException();         }         PushStack2PopStack();         return  _popStack.Pop();     }     public  T Peek ( )     {         if  (IsEmpty())         {             throw  new  QueueOverFlowException();         }         PushStack2PopStack();         return  _popStack.Peek();     }     private  void  PushStack2PopStack ( )     {         if  (_popStack.Count == 0 )         {             while  (_pushStack.Count != 0 )             {                 _popStack.Push(_pushStack.Pop());             }         }     }     public  bool  IsEmpty ( )     {         return  _pushStack.Count == 0  && _popStack.Count == 0 ;     } }