Java堆栈不遵循LIFO

时间:2014-11-08 16:18:08

标签: java data-structures functional-programming stack

为什么我的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()方法在上述程序中的工作原理如何?

3 个答案:

答案 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的原则?

课程StackVector中可以找到的课程java.util.*;的扩展。

使用Java API中包含的类Stack而不是在Java中实现Stack的好方法。

课程Vector已成为obsolete。假设Stack Vector打破了封装的OOP原则。您只希望能够访问Stack的顶部。但是,由于您的Stack Vector,因此它会从类Vector继承不需要的方法。

请参阅此处的Oracle Java文档:

除了VectorStackpeek()pop()的{​​{1}}方法之外,您还可以调用push()方法。这样您就可以访问empty()以上的顶部,或打印整个Stack

要解决此问题,您必须编写自己的Stack课程。您可以尝试将Stack实施为StackArrayLinkedList或使用Deque界面。