【问题标题】:Printing circular queue打印循环队列
【发布时间】:2016-06-23 09:02:08
【问题描述】:

我们如何在下面提到的代码中打印循环队列。 队列满后,我们删除一个项目并插入索引 0 处的下一个项目。 那我们怎么打印呢? 我们如何在下面提到的代码中打印循环队列。

class GQueue <T extends Object>
{
    T[] arr;
    int size;
    int front;
    int rear;
    int length;

    GQueue(int size)
    {
        this.size=size;
        arr=(T[])new Object[this.size];
        front=-1;
        rear=-1;
        length=arr.length;
    }

    void EnQueue(T data)
    { 
            if(isFull())
            {
                System.out.println("Queue full");
                return;
            }

                else if(isEmpty())
                  front=rear=0;
                else 
                 rear = (rear+1)%length;

             arr[rear]=data;
    }

    void DeQueue()
    {
        if(isEmpty())
           return;
        else if (front==rear)
        {
           front=rear=-1;
        }
        else 
           front=(front+1)%length;

    }

    T peek()
    {

        return arr[front];
    }

    boolean isEmpty()
    {
        if(front==-1 && rear==-1)
        return true;
        else 
            return false;


    }

    boolean isFull()
    {
        if( (rear+1) % length==front)
            return true;
        else 
            return false;

    }

    void print()
    {
        for(int i=front;i<=rear;i++)
        {
         System.out.print(arr[i]+" ");  
        }
         System.out.println();  
    }
}





public class GenericQueue {

public static void main(String[] args) {
    GQueue<Integer> gq = new GQueue<Integer>(10);
    gq.EnQueue(1);
    gq.EnQueue(2);
    gq.EnQueue(3);
    gq.EnQueue(4);
    gq.EnQueue(5);
    gq.EnQueue(6);
    gq.EnQueue(7);
    gq.EnQueue(8);
    gq.EnQueue(9);
    gq.EnQueue(10);


    gq.print();
    gq.DeQueue();
    gq.EnQueue(11);
    gq.print();
}

}

【问题讨论】:

  • 用笔怎么样?或者尝试调试。

标签: java data-structures queue


【解决方案1】:
void print(){
    if (!isEmpty()) {
        int i = front;
        do {
            System.out.print(" " + arr[i];
            i = ++i % arr.length;
        while (i != rear);
    }
}

未经测试,但我认为它是正确的,或者至少给出了大致的想法。

【讨论】:

  • 是的,它几乎工作了,除了它没有打印最后一个元素,它是最后一个元素。我们需要添加... System.out.print(" "+arr[rear]); ... while 循环结束后。
【解决方案2】:

只需在上面的代码中使用 while(i 来避免再次打印 System.out.print(" "+arr[rear])。

【讨论】:

    【解决方案3】:

    你可以试试这个代码!

    for(int i=front+1 ; i!=(rear+1) ; i=(i+1)%arr.length)
    {
       System.out.println(" "+arr[i]);
    }
    

    【讨论】:

      【解决方案4】:

      对于那些寻找打印循环队列的人来说,接受的答案在两种情况下会失败:

      1. 当我们只有一个条目时将打印完整的队列
      2. 不打印最后一个元素

      这是修改版看看:

      假设队列中只有一个条目 10

      int[] queue = new int[5]
      queue = {10,0,0,0,0}
      
      front = 0;
      rear = 0;
      

      接受的答案输出将是:

       10,0,0,0,0
      

      我们需要检查何时休息,即一旦我们到达后方位置。

      要获得正确的结果,请使用以下内容:

      public void print() {
          if (!empty()) {
              int i = front;
              do {
                  System.out.println(arr[i]);
                  if(i==rear)
                      break;
                  i = (i + 1) % (arr.length);
      
              } while (i != front);
          }
      }
      

      现在您的输出将是:

       10
      

      另外请注意,我们正在迭代直到 while (i != front) 这允许我们打印最后一个元素。

      【讨论】:

        【解决方案5】:

        会有两种情况:

        1. 前 == 0 & 后>=前

        对于案例 1:(如果)

        • 检查是否后方>=前方
        • 从前到后迭代 i 并打印

        对于案例 2:(其他)

        • 从队列的前面迭代 i 直到队列的末尾,例如,(Size-1)
        • 打印阵列!
        • 再次从 0 到后迭代 i 并打印数组

        【讨论】:

          【解决方案6】:

          其实正确的遮阳篷是:

          void print(){
              if (!isEmpty()) {
                  int i = front;
                  do {
                      System.out.print(" " + arr[i]);
                      i = ++i % arr.length;
                  } while (i != rear);
                  
                  if (front != rear) {
                      System.out.print(" " + arr[rear]);
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-12
            • 2016-03-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多