Java堆栈不遵循LIFO



为什么我的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类已经过时。说StackVector打破了OOP封装原理。您只希望能够访问Stack的顶部。但是,因为StackVector,所以它从类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实现为ArrayLinkedListDeque或使用List接口。

最新更新