【问题标题】:How to data be stored in Stack and Queue in java?java中如何将数据存储在堆栈和队列中?
【发布时间】:2017-10-30 21:26:02
【问题描述】:

当我将数据一一推送到堆栈中并将数据添加到队列中时,它会在不排序的情况下存储,但是当我使用循环并将这些相同的数据推送到堆栈中并添加到队列中时,数据会按排序方式存储。另一件事是,当我将数据一个一个地推送到堆栈中时,它会一个一个地存储数据,但对于队列,它会随机存储数据。我不明白如何将数据存储在堆栈和队列中? 代码如下:

import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Stack;

public class Stack_Queue_RealtionTwo {

    public static void main(String[] args) {

        Stack<Integer> stack = new Stack<>();
        Queue<Integer> queue = new PriorityQueue<Integer>();

        stack.push(5);
        stack.push(2);
        stack.push(3);
        stack.push(1);
        stack.push(4);
        stack.push(6);

        queue.add(5);
        queue.add(2);
        queue.add(3);
        queue.add(1);
        queue.add(4);
        queue.add(6);

        System.out.println("STACK: " + stack + "\nQUEUE: " + queue);
        System.out.println("\nAFTER POP AND POLL\n");
        System.out.println("STACK: " + stack.pop() + "\nQUEUE: " + queue.poll());

        stack.clear();
        queue.clear();

        ///using loop
        int[] x = {5, 2, 3, 1, 4, 6};

        for (int i = 0; i <= x.length; i++) {
            stack.push(i);
            queue.add(i);
        }

        System.out.println("\nSTACK: " + stack + "\nQUEUE: " + queue);
        System.out.println("\nAFTER POP AND POLL\n ");
        System.out.println("STACK: " + stack.pop() + "\nQUEUE: " + queue.poll());
    }
}

输出是:

    STACK: [5, 2, 3, 1, 4, 6]
    QUEUE: [1, 2, 3, 5, 4, 6]

    AFTER POP AND POLL

    STACK: 6
    QUEUE: 1

    STACK: [0, 1, 2, 3, 4, 5, 6]
    QUEUE: [0, 1, 2, 3, 4, 5, 6]

    AFTER POP AND POLL

    STACK: 6
    QUEUE: 0

【问题讨论】:

  • 那是因为您将i 放入列表中,而不是x[i]
  • 哦,如果你用索引遍历一个数组,使用i&lt;length而不是&lt;=。否则,您将收到ArrayIndexOutOfBoundsException。也许使用 foreach 循环会更容易。
  • 谢谢。使用 foreach 循环打印相同的值。
  • 但是在队列中,数据如何存储? @MalteHartwig
  • 什么意思?堆栈和列表都只是带有一些额外方法的列表,可以以某种方式访问​​值(队列为 FirstInFirstOut,堆栈为 LastInFirstOut)。所以他们会按照您放入的顺序添加元素。您想了解更具体的内部结构吗?然后你必须阅读JavaDoc,我相信还有更多细节。

标签: java algorithm data-structures stack queue


【解决方案1】:
  1. 您在示例中使用了 PriorityQueue。这意味着添加到 PriorityQueue 的值按其自然顺序存储(或按 Comparator 指定的顺序 - 但您在此示例中没有使用它)。要将值添加到队列并以 FirstInFirstOut 方式使用它,我建议使用 LinkedList 及其有助于将其用作队列的方法。

  2. 您没有正确编写“for”循环。你应该使用:

    for (int i = 0; i < x.length; i++) {
        stack.push(x[i]);
        queue.add(x[i]);
    

    }

这意味着您将存储在 x 数组中“i”索引处的值相加。在您的循环中,您刚刚添加了 i 的值,它首先用 0 初始化,然后递增 1。您还应该知道,在最后一个循环中,您可以获得ArrayIndexOutOfBoundsException,因为在您的示例中,x 数组的长度为 6 ,但存储在 x 数组中的值的最后一个索引是 [5]。例如,如果您在数组中仅存储一个值:int[] arr = { 64 }, arr.length = 1`,但该值存储在索引 0 处。

【讨论】:

  • 非常感谢。我能理解,但我不明白为什么 QUEUE: [1, 2, 3, 5, 4, 6] 我的数据是 x={5, 2, 3, 1, 4, 6} ?
  • @MehediHasan 你真的应该读一下the JavaDoc。它指出“优先级队列的元素根据其自然顺序或在队列构建时提供的比较器进行排序”。使用另一个队列实现而不是 PriorityQueue,您的元素将不会被重新排序。例如 LinkedList 和 ArrayDeque。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2013-12-04
  • 1970-01-01
相关资源
最近更新 更多