#include "priority.h"

PriorityQ::PriorityQ()
//Default constructor
{
  Queue();
}

void PriorityQ::Insert(QElement El, int &Success)
//Inserts El in a priority queue in its proper position.
//Pre : The queue has been created.
//Post: If the queue is not full, increments Rear and inserts El,
//      and adjusts position of El so that largest element is
//      always at the fron of the priority queue. Sets Success
//      to indicate success or failure.
{
  int Pos;        //index of current queue element
  int Next;       //index of next queue element
  QElement Temp;  //element to use in performing the exchange

  if (NumItems == MaxQueue)
    Success = False;                   //queue is full
  else
  {
    Rear = (Rear + 1) % MaxQueue;      //increment rear
    Items[Rear] = El;
    NumItems = NumItems + 1;
    Success = True;

    //move last element to its proper position
    if (NumItems > 1)
    {
      Pos = Rear;
      Next = Pos - 1;
      //correct negative subscript
      if (Next < 0)
	Next = MaxQueue - 1;

      while ((Pos != Front) && (Items[Pos] > Items[Next]))
      {
	//swap out of place values with neighbors
	Temp = Items[Pos];
	Items[Pos] = Items[Next];
	Items[Next] = Temp;
	//advance subscripts to next pair of elements
	Pos = Next;
	Next = Pos - 1;
	//correct negative subscript
	if (Next < 0)
	  Next = MaxQueue - 1;
      }
    }
  }
}
