为什么我的java堆栈在打印时没有遵循后进先出法的原则?
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()
方法在上述程序中是如何工作的?
toArray方法将按元素插入堆栈的顺序返回元素数组。如果您需要LIFO中的元素,请使用pop方法。你可以在这里浏览Stack api,
http://docs.oracle.com/javase/6/docs/api/java/util/Stack.html
我首先要说的是,和你一样,这让我很恼火。最原始意义上的堆栈无法访问顶部元素之外的元素。据我所知,这背后唯一的逻辑是java以存储的方式处理它。
至于Java中Stack的存储,它的存储方式与ArrayList非常相似(使用数组,填充时加倍)。类似地,Stack的toString来自Vector(类似于ArrayList),它从开头开始。由于堆栈的"顶部"是末尾,所以它最后输出。
下面是一些示例代码:
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
作为输出
Q:为什么我的java堆栈在打印时没有遵循后进先出法的原则?
类别Stack
是类别Vector
的扩展,其可在java.util.*;
中找到。
使用Java API中包含的类Stack
是而不是在Java中实现Stack
的好方法。
Vector
类已经过时。说Stack
是Vector
打破了OOP封装原理。您只希望能够访问Stack
的顶部。但是,因为Stack
是Vector
,所以它从类Vector
继承了不需要的方法。
请参阅此处的Oracle Java文档:
- http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html
- http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html
因此,除了peek()
、pop()
、push()
和empty()
的Stack
方法外,您还可以调用Vector
方法。这将允许您访问不仅仅是Stack
的顶部,或者打印整个Stack
。
要解决这个问题,您必须编写自己的Stack
类。您可以尝试将Stack
实现为Array
、LinkedList
、Deque
或使用List
接口。