堆栈,foreach,错误的命令?

dur*_*597 22 java queue stack

当使用Java的for每种语法时,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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Stack: 
1
2
3
4
5

Queue:
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 这有意义吗?这是一个错误吗?
  2. 我可以保证这至少会以正确的顺序返回Queue元素吗?
  3. 在消费(处理)a Stack或a时Queue,这是最好的方法吗?或者我应该使用以下内容进行更多手动循环:while(!s.isEmpty()) { handle(s.pop()); }while(!l.isEmpty()) { handle(l.poll()); }

fvu*_*fvu 19

Stack的Javadoc中有一个有趣的脚注:

Deque接口及其实现提供了更完整和一致的LIFO堆栈操作集,应优先使用此类.例如:

Deque stack = 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);
    }
  }   
Run Code Online (Sandbox Code Playgroud)

....
Deque:
5
4
3
2
1
Run Code Online (Sandbox Code Playgroud)

因此,可以切换到Deque以获得更一致的行为.


小智 14

您需要使用pop()和poll()而不是for循环.这是Stack/Queue提供的API.

迭代时,您直接迭代Stack/Queue的内部表示.