24

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. これにより、少なくとも Queue 要素が正しい順序で返されることを保証できますか?
  3. Stackaまたは aを消費 (処理) する場合、Queueこれが最善の方法ですか? または、次のようなものでより手動のループを作成する必要があります:while(!s.isEmpty()) { handle(s.pop()); }またはwhile(!l.isEmpty()) { handle(l.poll()); }
4

2 に答える 2

21

Stack の Javadoc に興味深い脚注があります。

Deque インターフェイスとその実装によって、より完全で一貫性のある 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

したがって、より一貫した動作のために Deque に切り替えることもできます。

于 2013-02-15T18:23:02.353 に答える
15

for ループの代わりに pop() & poll() を使用する必要があります。それが Stack/Queue が提供する API です。

反復するときは、スタック/キューの内部表現を直接反復しています。

于 2013-02-15T18:10:17.917 に答える