【问题标题】:Stack, foreach, wrong order?堆栈,foreach,错误的顺序?
【发布时间】:2021-05-27 09:14:55
【问题描述】:

当使用 Java 的 foreach 语法时,Stack 不对输出元素使用 LIFO 排序。考虑以下代码:

import java.util.Queue;
import java.util.Stack;
import java.util.LinkedList;

public class QueueStackTest {
  private static int[] numbers = {1, 2, 3, 4, 5};

  public static void main(String[] args) {
    Stack<Integer> s = new Stack<Integer>();
    Queue<Integer> l = new LinkedList<Integer>();

    for (int i : numbers) {
      s.push(i);
      l.offer(i);
    }

    System.out.println("Stack: ");
    for(Integer i : s) {
      System.out.println(i);
    }

    System.out.println();
    System.out.println("Queue:");
    for(Integer i : l) {
      System.out.println(i);
    }
  }
}

输出:

Stack: 
1
2
3
4
5

Queue:
1
2
3
4
5

问题:

  1. 这有意义吗?是错误吗?
  2. 我能否保证这至少会以正确的顺序返回队列元素?
  3. 当使用(处理)StackQueue 时,这是最好的方法吗?或者我应该用类似的东西做一个更手动的循环:while(!s.isEmpty()) { handle(s.pop()); }while(!l.isEmpty()) { handle(l.poll()); }

【问题讨论】:

  • 你试过只使用普通的 for 循环吗?

标签: java stack queue


【解决方案1】:

有一个有趣的脚注in Stack's Javadoc

一组更完整和一致的 LIFO 堆栈操作是 由 Deque 接口及其实现提供,应该 优先于此类使用。例如:

双端队列 = new ArrayDeque();

您的程序的扩展版本:

  public static void main(String[] args) {
    Stack<Integer> s = new Stack<Integer>();
    Deque<Integer> d = new ArrayDeque<Integer>();
    Queue<Integer> l = new LinkedList<Integer>();

    for (int i : numbers) {
      s.push(i);
      l.offer(i);
      d.push(i);
    }

    System.out.println("Stack: ");
    for(Integer i : s) {
      System.out.println(i);
    }

    System.out.println();
    System.out.println("Queue:");
    for(Integer i : l) {
      System.out.println(i);
    }
    System.out.println();
    System.out.println("Deque:");
    for(Integer i : d) {
      System.out.println(i);
    }
  }   

给予

....
Deque:
5
4
3
2
1

所以也许切换到双端队列以获得更一致的行为。

【讨论】:

  • 这是一个比另一个更好的答案。 +1
【解决方案2】:

你需要使用 pop() & poll() 而不是 for 循环。这就是 Stack/Queue 提供的 API。

当你迭代时,你是在直接迭代 Stack/Queue 的内部表示。

【讨论】:

  • 也许您可以了解 why pop() 无法使用的原因。例如,如果一个元素被移除,其他集合中会发生什么?并且“迭代内部表示”有点误导(因为有界大小的队列可能是“循环的”)——迭代器真正返回的是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 2011-03-27
  • 2010-11-28
  • 2012-09-26
  • 2011-03-03
相关资源
最近更新 更多