循环队列(Java实现)

        循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。队列可以更简单防止伪溢出的发生,但队列大小是固定的。循环队列的使用分两种情况:

        1、牺牲一个存储单元,因为队空时,有front=rear,而当队满时,也是front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize。Java实现代码如下:

               public class CircularQueue {
                       private int MaxSize; //队列的容量
                       private int[] arr; //队列的存储结构(用一维数组作为队列的存储结构)
                       private int front;//队头指针
                       private int rear;//队尾指针
                    

                public CircularQueue(int MaxSize) { //构造一个队列时需要指定队列的容量
                      this.MaxSize = MaxSize;
                      arr = new int[MaxSize];
                      front = 0;
                      rear = 0;
                  }

            //判空
           public boolean isEmpty(){
                return rear == front; //当队头指针赶上队尾指针时
         }

          //判满
         public boolean isFull(){
                return (rear + 1) % MaxSize == front;
         }

        //入队
       public void addElement(int elem){
         try {
              if(isFull()){
                  throw new Exception("队列已满!");
            }
          arr[rear] = elem; //将数据插入到rear所在的位置
          rear = (rear+1 ) % MaxSize;
        } catch (Exception e) {
             e.printStackTrace();
       }
    }
      //出队方法
     public int removeElement(){
          int  varlue = 0; 

          try {
               if(isEmpty()){
                      throw new Exception("队列已空!");
              }
              value = arr[front];
              front = (front+1)%MaxSize;
       } catch (Exception e) {
               e.printStackTrace();
       }
              return value;
      }
}

  

2、不用牺牲存储单元,增加一个成员变量(如 count)记录入队元素的个数,当count=0时队列为空,当count=MaxSize时队列满;Java代码如下:

    public class CircularQueue {
                       private int MaxSize; //队列的容量
                       private int[] arr; //队列的存储结构(用一维数组作为队列的存储结构)
                       private int front;//队头指针
                       private int rear;//队尾指针
                       private int count; //记录入队元素的个数

                public CircularQueue(int MaxSize) { //构造一个队列时需要指定队列的容量
                      this.MaxSize = MaxSize;
                      arr = new int[MaxSize];
                      front = 0;
                      rear = 0;

                      count = 0;
                  }

            //判空
           public boolean isEmpty(){
                return count == 0;
         }

          //判满
         public boolean isFull(){
                return  count == MaxSize;
         }

        //入队
       public void addElement(int elem){
         try {
              if(isFull()){
                  throw new Exception("队列已满!");
            }
          arr[rear] = elem; //将数据插入到rear所在的位置
          rear = (rear+1 ) % MaxSize;

           count++;
        } catch (Exception e) {
             e.printStackTrace();
       }
    }
      //出队方法
     public int removeElement(){
          int  varlue = 0; 

          try {
               if(isEmpty()){
                      throw new Exception("队列已空!");
              }
              value = arr[front];
              front = (front+1)%MaxSize;

              count--;
       } catch (Exception e) {
               e.printStackTrace();
       }
              return value;
      }
}

原文地址:https://www.cnblogs.com/lone5wolf/p/12313360.html