当使用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);
}
}
}
Output:
Stack:
1
2
3
4
5
Queue:
1
2
3
4
5
问题:
- 这有道理吗?这是一个错误吗?
- 我可以保证这至少会以正确的顺序返回队列元素吗?
- 当消费(加工)a
Stack
or a Queue
,这是最好的方法吗?或者我应该使用类似以下内容进行更多手动循环:while(!s.isEmpty()) { handle(s.pop()); }
or while(!l.isEmpty()) { handle(l.poll()); }
有一个有趣的脚注在 Stack 的 Javadoc 中 http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html:
一组更完整且一致的 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);
}
}
gives
....
Deque:
5
4
3
2
1
因此,也许切换到 Deque 以获得更一致的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)