2013-02-15 56 views
17

當使用Java的for每種語法時,Stack不使用輸出元素上的LIFO排序。請看下面的代碼:堆棧,foreach,錯誤的順序?

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()); }
+0

您是否嘗試過使用正常循環? – 2013-02-15 18:10:17

回答

14

有一個有趣的註腳in Stack's Javadoc

LIFO堆棧操作的更完整,一致通過的Deque接口及其實現,這應該 優先使用這個類提供 。例如:

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); 
    } 
    } 

.... 
Deque: 
5 
4 
3 
2 
1 

所以,也許切換到deque的一個更加一致的行爲。

+0

這是一個比另一個更好的答案。 +1 – durron597 2013-02-15 18:34:35

14

您需要使用pop()方法&輪詢()而不是爲循環。這就是Stack/Queue提供的API。

迭代時,您直接迭代Stack/Queue的內部表示。

+0

也許你可以進入_why_'pop()'不能使用的原因。例如,如果元素被刪除,其他集合中會發生什麼?而'迭代內部表示'有點誤導(因爲綁定大小的隊列可能是'循環') - 迭代器真正返回的是什麼? – 2013-02-15 18:27:41