Java堆栈不遵循LIFO
为什么我的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
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。