java数据结构六、队列

class Queue
   {
   private int maxSize;
   private long[] queArray;
   private int front;
   private int rear;
   private int nItems;
//--------------------------------------------------------------
   public Queue(int s)          // constructor
      {
      maxSize = s;
      queArray = new long[maxSize];
      front = 0;
      rear = -1;
      nItems = 0;
      }
//--------------------------------------------------------------
   public void insert(long j)   // put item at rear of queue
      {
      if(rear == maxSize-1)         // deal with wraparound
         rear = -1;
      queArray[++rear] = j;         // increment rear and insert
      nItems++;                     // one more item
      }
//--------------------------------------------------------------
   public long remove()         // take item from front of queue
      {
      long temp = queArray[front++]; // get value and incr front
      if(front == maxSize)           // deal with wraparound
         front = 0;
      nItems--;                      // one less item
      return temp;
      }
//--------------------------------------------------------------
   public long peekFront()      // peek at front of queue
      {
      return queArray[front];
      }
//--------------------------------------------------------------
   public boolean isEmpty()    // true if queue is empty
      {
      return (nItems==0);
      }
//--------------------------------------------------------------
   public boolean isFull()     // true if queue is full
      {
      return (nItems==maxSize);
      }
//--------------------------------------------------------------
   public int size()           // number of items in queue
      {
      return nItems;
      }
//--------------------------------------------------------------
   }  // end class Queue

class QueueApp
   {
   public static void main(String[] args)
      {
      Queue theQueue = new Queue(5);  // queue holds 5 items

      theQueue.insert(10);            // insert 4 items
      theQueue.insert(20);
      theQueue.insert(30);
      theQueue.insert(40);

      theQueue.remove();              // remove 3 items
      theQueue.remove();              //    (10, 20, 30)
      theQueue.remove();

      theQueue.insert(50);            // insert 4 more items
      theQueue.insert(60);            //    (wraps around)
      theQueue.insert(70);
      theQueue.insert(80);

      while( !theQueue.isEmpty() )    // remove and display
         {                            //    all items
         long n = theQueue.remove();  // (40, 50, 60, 70, 80)
         System.out.print(n);
         System.out.print(" ");
         }
      System.out.println("");
      }  // end main()
   }  // end class QueueApp

    1、此为循环队列,队列中有nItems来记录当前队列中数据项的个数,这个会使insert和remove方法增加一点额外的操作,如果处理大量的插入和移除操作的话,就会影响性能。通过数据容量比队列项个数还要大一的方式来实现没有数据项计数的循环队列,这个属于典型的用空间复杂度来换取时间复杂度的方式,该队列在在满的情况下,永远有一个是空闲着的。

class Queue
{
private int maxSize;
private long[] queArray;
private int front;
private int rear;
//--------------------------------------------------------------
public Queue(int s)          // constructor
   {
   //扩充+1的容量;
   maxSize = s+1;
   queArray = new long[maxSize];
   front = 0;
   rear = -1;
   }
//--------------------------------------------------------------
public void insert(long j)   // put item at rear of queue
   {
   if(rear == maxSize-1)         // deal with wraparound
      rear = -1;
   queArray[++rear] = j;         // increment rear and insert
   }
//--------------------------------------------------------------
public long remove()         // take item from front of queue
   {
   long temp = queArray[front++]; // get value and incr front
   if(front == maxSize)           // deal with wraparound
      front = 0;
   return temp;
   }
//--------------------------------------------------------------
public long peekFront()      // peek at front of queue
   {
   return queArray[front];
   }
//--------------------------------------------------------------
//其实其他操作跟有nItems的都一样,扩充一的容量主要是为了方便时空是满的判
//断,这样满的情况是front和rear会有2的差距,而空的情况是1的差距
public boolean isEmpty()    // true if queue is empty
   {
   return (rear+1==front||(front+maxSize-1)==rear);
   }
//--------------------------------------------------------------
public boolean isFull()     // true if queue is full
   {
	 return (rear+2==front||(front+maxSize-2)==rear);
   }
//--------------------------------------------------------------
public int size()           // number of items in queue
   {
   if(rear>front){
	   return rear-front+1;
   }else{
	  return (maxSize-front)+(rear+1) ;
   }
   }
}

        2、双端队列

        双端队列就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。如果禁止一端,双端队列就和栈一样。

        3、优先级队列

        优先级队列是根据关键字值的优先级有序存放的对队列,除了可以访问最优先关键字值的数据项外,优先级队列还应该可以实现相当快的插入速度,因此优先级队列通常是用堆的数据结构来实现的。

        效率:用数组实现的话,插入操作需要O(N)的时间,删除需要O(1),可以通过堆来改进;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值