Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java堆栈不遵循LIFO_Java_Data Structures_Functional Programming_Stack - Fatal编程技术网

Java堆栈不遵循LIFO

Java堆栈不遵循LIFO,java,data-structures,functional-programming,stack,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.pri

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

toArray方法将按照元素插入堆栈的顺序返回元素数组。 如果需要后进先出中的元素,请使用pop方法。 您可以在这里查看堆栈api


首先,我要说,像你一样,这让我很恼火。堆栈在其最原始的意义上不能访问除顶层元素之外的其他元素。据我所知,这背后的唯一逻辑是java以存储的方式处理它

至于Java中堆栈的存储,它的存储方式与ArrayList大致相同(使用数组,填充时加倍)。类似地,堆栈的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()+" ");
    }
}
作为输出

Q:为什么我的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); 
    }
}
堆栈
是类
向量
的扩展,可在
java.util.*中找到

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

向量
已成为。说
堆栈
向量
打破了面向对象的封装原则。您只希望能够访问
堆栈的顶部。但是,由于您的
堆栈
是一个
向量
,因此它从类
向量
继承了不需要的方法

请参见此处的Oracle Java文档:

因此,除了
peek()
pop()
push()
empty()的
堆栈方法之外,您还可以调用
Vector
方法。这将允许您访问不仅仅是
堆栈顶部
,或者打印整个
堆栈


要解决这个问题,您必须编写自己的
堆栈
类。您可以尝试将
堆栈
实现为
数组
链接列表
Deque
或使用
列表
界面。

后进先出。您没有取出任何内容。打印与从堆栈中获取元素不同。尝试使用
pop
直到堆栈为空:
而(!myStack.empty())System.out.println(myStack.pop())是的,您可以弹出堆栈,但真正的问题是堆栈继承自Vector。