当前位置: 首页 > 知识库问答 >
问题:

创建队列类并从第一个到最后一个打印内部的元素

公羊安怡
2023-03-14

我目前有一个任务,我需要创建我自己的队列类和方法,如enquue()、dequue(),并从头到尾显示元素。这是我到目前为止所做的:

节点类:

  class Node{
        //attributes
        public String data;
        public Node next;
    
        //basic constructor
        Node(){
    
        }
    
        Node(String data){
            this.data = data;
            this.next = null;
        }
    
        //accessors
        public String getData(){
            return this.data;
        }
        public Node getNext(){
            return this.next;
        }
    
        //mutators
        public void setData(String tmpData){
            this.data = tmpData;
        }
        public void setNext(Node tmpNext){
            this.next = tmpNext;
        }
    }

这是我的队列类:

class MyQueue{
    //attributes
    private Node front, rear;

MyQueue(){
    this.front = null;
    this.rear = null;
}

//method to insert one node at the end of the queue
public void enqueue(Node node){
    node.next = this.rear;
    this.rear = node;
}

//get and remove the front node from queue
public String dequeue(){
    //check if the queue empty or not
    if(this.rear == null){
        System.out.println("Queue is empty");
        return null;
    } else if(this.rear.next == null){ // the queue only have 1 element
        this.rear = null;
        return this.rear.toString();
    } else{ //remove the front node
        Node tmp = this.rear;
        //traverse to reach the second element
        while (tmp.next.next != null) {
            tmp = tmp.next;
        }
        //remove first element
        tmp.next = null;
        return tmp.next.toString();
    }
}

//check if the queue is empty or not
public boolean isEmpty(){
    if(this.rear == null){
        return true;
    } else{
        return false;
    }
}

//method to display
public void displayQueue(){
    if(this.rear == null){
        System.out.println("Queue is empty");
    } else{
        Node tmp = this.rear;
        while(tmp != null) {
            System.out.print(tmp.data + " ");
            tmp =tmp.next;
        }
        System.out.println();
    }
}
}

以及测试的主要类别:

class Main{
    public static void main(String[] args) {
        MyQueue queue = new MyQueue();
        queue.enqueue(new Node("1"));
        queue.enqueue(new Node("2"));
        queue.enqueue(new Node("3"));
        queue.displayQueue();
        
    }
}

所以我想要的输出是

1 2 3

但是,我的输出是:

3 2 1

你们能看看吗,我想这一定和displayQueue()方法有关,但是我不知道如何修复它,你们能帮我吗?非常感谢

共有1个答案

沙宣
2023-03-14

我相信,您的en队列逻辑在很大程度上是正确的,因为您在队列的末尾添加了新元素,并将this.rear重置为添加的新元素。但是,您应该使您的displayQueue方法递归,以便您可以遵循先进先出原则,并从开始到结束遍历队列,而不是像现在这样从结束到开始。这里推荐递归的原因是,您当前构建队列的方式是从最后一个节点到第一个节点只有一条单向路径,反之亦然,因此递归方法的基本条件可以是当节点您的迭代是null。此时,您可以开始打印节点,同时从队列的开始到结束进行回溯。请注意,当您正在迭代的节点是队列的开始时,您正在迭代的节点的下一个指针将为空。下面是递归displayQueue方法在使用helper函数时的样子,

public void displayQueue(){
    if (this.rear == null) {
        System.out.println("Queue is empty");
    } 
    else {
        displayQueueHelper(this.rear);
    }
}

private void displayQueueHelper(Node n) {
    if (n == null) {
        return;
    }
    displayQueueHelper(n.next);
    System.out.print(n.data + " ");
}

我选择使用递归助手函数,因为您仍然应该使用主外部displayQueue函数来检查队列是否是空的,然后再决定是否迭代队列。

 类似资料:
  • 问题内容: 这行一直有效,直到我在第二个字段中留有空格。 有没有办法让awk打印$ 2或以上的所有内容?($ 3,$ 4 ..直到我们没有更多的列了?) 我想我应该补充一点,就是我在Windows环境中使用Cygwin进行此操作。 问题答案: 将打印除第一列以外的所有内容: 将打印除第一列以外的所有列:

  • 我写了一个函数来交换C中队列的第一个和最后一个元素 注意:“只考虑(空、去队列、CREATQ和入队)是其他函数。 但是如果最后一个元素在中间被复制,如果这是队列的元素(5,1,9,3,9),如果我们跟踪这些元素上的函数,它将会是(9,1,3,5),有一个丢失了! 那么,如果这个函数有逃避这个或任何其他想法的话?!

  • 问题内容: 我正在尝试从DbgView日志文件中删除前两列(我对此不感兴趣)。我似乎找不到从第3列开始直到行尾打印的示例。请注意,每行都有可变的列数。 问题答案: …或更简单的解决方案: 只需添加正确的定界符(-d),您将获得相同的效果。

  • 我目前正在与tkinter一起完成一项学校作业,为用户创建一个图形用户界面以输入他们的输入。我决定将输入分成不同的页面,以避免用户被问题淹没,并且不需要滚动 每一页都有一系列标签和条目,在一个右除数和一个左除数上分开,我已经设法在每一页上实现了这一点,付出了一些努力。这是我工作代码的简化版本: 然而,在将每个页面拆分为两个不同的Frame()容器时,我遇到了两个问题: 用ipadx和ipady设置

  • 问题内容: 有没有办法只分割列表中的第一项和最后一项? 例如; 如果这是我的清单: 我 想 这样做(显然是无效的语法): 我尝试过的一些方法: 问题答案: 单程: 更好的方法(不使用切片,但更易于阅读):

  • 问题内容: hello 我要选择吗? 只要我在commentList中还有另一个作为实际的最后一个孩子,那就行不通。在这种情况下是否可以使用last- child选择器来选择的最后出现? 问题答案: 仅在有问题的元素是容器的最后一个子元素而不是特定类型的元素的最后一个元素时起作用。为此,你想要 根据@BoltClock的注释,这仅检查最后一个元素,而不检查类为的最后一个元素。