为什么我的java堆栈在打印时不遵循LIFO的原则?
import java.util.*;
class StackTrace
{
public static void main(String []ar)
{
Stack myStack = new Stack();
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
System.out.println(myStack);
Object Arr[]=myStack.toArray();
for(Object a:Arr)
System.out.println(a);
}
}
输出:
[1, 2, 3, 4]
1
2
3
4
在上面的代码中,语句System.out.println(myStack);
是按顺序打印数据而不是以先出先后的方式打印数据。
为什么会这样?
以及toArray()
方法在上述程序中的工作原理如何?
答案 0 :(得分:1)
toArray方法将按照它们插入堆栈的顺序返回元素数组。 如果你需要LIFO中的元素,请使用pop方法。 你可以在这里浏览Stack api,
http://docs.oracle.com/javase/6/docs/api/java/util/Stack.html
答案 1 :(得分:1)
我开始说,就像你一样,这让我生气。其中最原始意义上的堆栈不能访问除顶部元素之外的元素。据我所知,这背后唯一的逻辑是java正在以它的存储方式对待它。
对于在Java中存储堆栈,它以与ArrayList大致相同的方式存储(使用数组,填充时加倍)。类似地,Stack的toString来自Vector(类似于ArrayList),它从头开始。自" top"堆栈的结尾是最后输出的。
以下是一些示例代码:
import java.util.*;
public class StacksTesting
{
public static void main(String[] args)
{
Stack<Integer> st = new Stack<Integer>();
for(int i=0; i<10; i++)
st.add(i);
System.out.println(st);
while(!st.isEmpty())
System.out.print(st.pop()+" ");
}
}
会给:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
9 8 7 6 5 4 3 2 1 0
作为输出
答案 2 :(得分:0)
问:为什么我的java-stack在打印时不遵循LIFO的原则?
课程Stack
是Vector
中可以找到的课程java.util.*;
的扩展。
使用Java API中包含的类Stack
是而不是在Java中实现Stack
的好方法。
课程Vector
已成为obsolete。假设Stack
是 Vector
打破了封装的OOP原则。您只希望能够访问Stack
的顶部。但是,由于您的Stack
是 Vector
,因此它会从类Vector
继承不需要的方法。
请参阅此处的Oracle Java文档:
除了Vector
,Stack
,peek()
和pop()
的{{1}}方法之外,您还可以调用push()
方法。这样您就可以访问empty()
以上的顶部,或打印整个Stack
。
要解决此问题,您必须编写自己的Stack
课程。您可以尝试将Stack
实施为Stack
,Array
,LinkedList
或使用Deque
界面。