从我的 user/main class 控制链表队列,不工作

Controlling a linked list queue from my user/main class, not working

好的,所以我需要创建 queue(包含入队、出队和 isEmpty 方法)、queueNode(存储名称、setter 和 getter)和 queueUser(主要) classes。用户一次输入一个名字。输入 3 个名称后,每个输入的新名称都会将队列的前面踢到屏幕上。此过程将继续,直到用户输入 "quit" 作为名称。一旦发生这种情况,将显示所有剩余名称。除了我的 user/main class,我什么都有了。我似乎无法让它正常工作。它接受 3 个名字,在输入第三个名字后,显示输入的名字。问题是,它停在那里。我需要它继续前进。我觉得我需要一个不同的循环,但我现在被困住了。没有老师的帮助,教科书中没有任何内容,我碰壁了。非常感谢任何帮助或建议。我对 Java 还是很陌生,对数据结构也是全新的。

queueUser

import java.util.Scanner;

public class queueUser {

public static void main(String[] args){
    queue qName = new queue();
    Scanner input = new Scanner(System.in);
    int limit = 3;
    String name;
    String stop = "quit";
    boolean flag = false;

do{

    for(int i = 0; i < limit; i++){
        System.out.println("Please enter one name: ");      
        name = input.nextLine();
            if(!name.equalsIgnoreCase(stop)){
                qName.enqueue(name);
                flag = true;
            }else{
                flag = false;
                while(!qName.isEmpty()){
                    System.out.println(qName.dequeue());
                    }
                }
            }
        System.out.println(qName.dequeue());

    }while(!flag);
  }
}

队列

public class queue{

queueNode front, rear;
int count = 0;

public queue(){
    front = null;
    rear = null;
}

public boolean isEmpty(){
    boolean empty = false;
        if(front == null){
            empty = true;
        }else{
            empty = false;
        }
    return empty;
}

public void enqueue(String pName){
    queueNode node = new queueNode(pName);
        if(isEmpty()){
            front = node;
        }else{
            rear.setNext(node);
        }
    rear = node;
}

public String dequeue(){
    String firstName = null;
    if(isEmpty()){
        System.out.println("Queue is empty!");
    }else{
        firstName = front.getName();
        front = front.getNext();
    }
    return firstName;
  } 
}

queueNode

public class queueNode {

private String name;
private queueNode next;

public queueNode(String pName){
    name = pName;
}

public void setNext(queueNode pNext){
    next = pNext;
}

public queueNode getNext(){
    return next;
}

public void setName(String pName){
    name = pName;
}

public String getName(){
    return name;
    }
}

编辑: 所有这些都适用于您的 QueueUser class。

  1. 确保您的 class 名称采用 CamelCase。
  2. do-while 循环是多余的,因为标志起始值为 false。您可以通过将其设为 while 循环来完成同样的事情(除非您的教授要求有一个循环)。

    while(!flag) {
        //do your stuff
    }
    
  3. 彻底摆脱for循环

  4. 你的原始代码的问题是标志值被调换了,标志已经是 false 所以没有必要在 do-while 循环中声明它。如果你想留下这个多余的部分,它需要是 flag = false。

    if(!name.equalsIgnoreCase(stop)){
            qName.enqueue(name);
            flag = true; //<-----SHOULD BE FALSE if you don't want to break the loop (is redundant)
        }else {
            flag = false //<-------CHANGE TO TRUE
    
  5. 将 limit 变量设置为 0(或将其重命名为 count 并将其设置为 0)以满足教授想要的计数功能,并在 while 循环中添加一个 if 语句以在达到 3 时出列.

    count++
    if(count >= 3) {
        System.out.println(qName.dequeue());
    }
    

(编辑:你的教授)

在你的循环代码中你是这样说的:

给我三个名字,但如果最近给出的名字是 "quit",我将停止。 在你给我这三个名字之后,我会告诉你排在最前面的是什么。 现在再来一遍。

当您重复循环直到您输入另外 3 个名字时,您不会从队列中移除。即使那样,您也只会使顶部出列,队列中剩下 4 个。

首先,您的队列 class 中有一个从未使用过的变量 int 计数。如果你使用它,它将极大地改进这里的解决方案。当有东西入队时,增加 count 变量。出列时递减。添加一个将 return 计数变量的方法。然后就这样做:

boolean flag = false;
do {
    System.out.println("Please enter one name: ");
    name = input.nextLine();
    if(name.equalsIgnoreCase("stop")) flag = true;
    if (!flag) qName.enqueue(name);
    if (qName.getCount() > 3) System.out.println(qName.dequeue());
} while (!flag);
for (int x = 0; x < 3; x++) System.out.println(qName.dequeue());

如果您的导师不想要它,那么您的代码应该如下所示:

boolean flag = false;
int count = 0;
do {
    System.out.println("Please enter one name: ");
    name = input.nextLine();
    if (name.equalsIgnoreCase("stop")) flag = true;
    if (!flag) {
        count++;
        qName.enqueue(name);
    }
    if (count > 3) {
        count--;
        System.out.println(qName.dequeue());
    }
} while (!flag);
for (int x = 0; x < 3; x++) System.out.println(qName.dequeue());