2014-01-06 91 views
3

这是算法的一个版本,我有:复制堆栈阵列

public void copyStackToArray(Stack<Integer> stack) { 
    int i = 0; 
    while (!this.bestRouteStack.empty()) { 
     this.array[i++] = stack.pop(); 
    } 
} 

(在阵列上的边界,保证没事这里我的代码)

我想知道是否有是一个库算法,可以做到这一点,但搜索没有任何结果。

+0

是'Stack'自己的实现或Java的? –

+0

Java的'java.util.Stack' – user473973

+10

检查出它重载的'toArray()'方法。 –

回答

6

栈子类,其已经支持此向量,试试这个...

stack.toArray(array) 

Here is the Javadoc for this

+0

它实际上是从[java.util.Vector'中继承](http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html#methods_inherited_from_class_java.util.Vector),而不是'列表“(你的链接甚至可以进入”Vector“文档)。 – ajp15243

+0

@ ajp15243好点,更正。 – Todd

0

我发现当我使用toArray方法时,我得到了与我预期相反的结果。当我创造了这个堆栈:

Stack<String> stack = new Stack<>(); 
stack.push("foo"); 
stack.push("bar"); 

我想要像一个数组:

{"bar", "foo"} 

原因当然栈LIFO。如果你将每个元素从堆栈中弹出,你首先会弹出“bar”,然后是“foo”。

取而代之,toArray返回{"foo", "bar"}

解决方案是使用LinkedList代替。在LinkedList上有一个push方法,它和addFirst一样执行,结果是一个列表,其内容(如果你经过它的话)是“bar”,然后是“foo”。它也有如预期返回的toArray方法。


测试用例:

LinkedList<String> list = new LinkedList<>(); 
list.push("foo"); 
list.push("bar"); 
String[] arr = list.toArray(new String[0]); 
Assert.assertArrayEquals(new String[] { "bar", "foo" }, arr);