java 打印循环队列

cfh9epnr  于 2022-12-28  发布在  Java
关注(0)|答案(7)|浏览(242)

我们如何在下面提到的代码中打印循环队列。在队列满了之后,我们删除一个项目,然后插入索引为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();
}

}

daolsyd0

daolsyd01#

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

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

nr7wwzry

nr7wwzry2#

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

5lhxktic

5lhxktic3#

你可以试试这个代码!

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

nbewdwxp4#

对于那些寻找打印循环队列的人来说,接受的答案在两种情况下会失败:
1.当我们只有一个条目时,我将打印整个队列
1.不打印最后一个元素
这是一个修改版看看:
假设队列中只有一个条目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),这允许我们打印最后一个元素。

q3qa4bjr

q3qa4bjr5#

将出现两种情况:
1.前== 0和后〉=前
1.后
对于情况1:(如果)

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

对于情况2:(else)

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

4szc88ey6#

实际上,正确的awnser是:

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]);
        }
    }
}
brgchamk

brgchamk7#

这是我的完整工作解决方案,通过代码沿着步骤进行了说明:

我使用String数组实现了一个循环队列(我将其命名为“words”),我将条件分开,并为以下每种情况编写了单独的循环:
1.当循环队列为空时(前==后&后== -1)
您无法打印任何内容,因此我在控制台上打印了“CQ empty

if (this.isEmpty())
    System.out.println("CQ Empty");

1.当前部〈后部时
我运行了一个for循环,打印了从front + 1到rear指向的元素(这里,words是数组的名称

for (int i = this.front + 1; i <= this.rear; i++)
    System.out.print(" " + this.words[i]);

1.当前部〉后部时||循环队列.isFull()==真
我的isFull()条件是:(前面==后面&&后面!= -1)||(front == -1 && rear == size - 1).所以我在这里实现了一个do while循环,在front == rear和front〈rear的情况下都可以工作.在实现这个循环之前,我尝试使用for循环,但是它根本不让我执行,因为它本身在开始时就满足了退出条件,因为它是一个入口控制循环.

int i = (this.front + 1) % this.size;
do {
    System.out.print(" " + this.words[i] + " " + i);
        i = (i + 1) % this.size;
} while (i != (this.rear + 1));

注意:第三种情况下的代码实现也涵盖了第二种情况,但我编写第二种情况只是为了代码可读性和更容易初步理解。

我的最终代码
public void showAllCircularQueueElements(){
    System.out.println();
    if (this.isEmpty())
        System.out.println("CQ Empty");
    else if (this.front < this.rear) {
        for (int i = this.front + 1; i <= this.rear; i++)
            System.out.print(" " + this.words[i] + " " + i);
    } else if (this.isFull() || this.front > this.rear) {
        int i = (this.front + 1) % this.size;
        do {
            System.out.print(" " + this.words[i] + " " + i);
            i = (i + 1) % this.size;
        } while (i != (this.rear + 1));
    } else {
        System.out.println("Couldnt display");
    }
    System.out.println();
}

相关问题