如何在Java中弹出堆栈中的第一个添加项?

如何在Java中弹出堆栈中的第一个添加项?,java,Java,如何弹出堆栈中最后添加的项,而不是第一个添加的项?我试过了,但就是不起作用。多谢各位 import java.util.ArrayList; import java.util.List; import java.util.Stack; public class Exercise0204 { public static void main(String[] args) { Stack<String> stack = new Stack<String&g

如何弹出堆栈中最后添加的项,而不是第一个添加的项?我试过了,但就是不起作用。多谢各位

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Exercise0204 {

    public static void main(String[] args) {
        Stack<String> stack = new Stack<String>();
        stack.push("bottom");
        System.out.println(stack);

        stack.push("second");
        System.out.println(stack);

        stack.push("third");
        System.out.println(stack);

        stack.push("fourth");

        System.out.println(stack);

            List list = new ArrayList(stack);

        for (int i = 0; i <stack.size(); i++) {     

            list.remove(i);
        }


    }

}
import java.util.ArrayList;
导入java.util.List;
导入java.util.Stack;
公开课练习0204{
公共静态void main(字符串[]args){
堆栈=新堆栈();
堆叠。推动(“底部”);
System.out.println(堆栈);
堆栈推送(“第二”);
System.out.println(堆栈);
堆栈。推送(“第三”);
System.out.println(堆栈);
堆叠。推送(“第四”);
System.out.println(堆栈);
列表=新的ArrayList(堆栈);

对于(int i=0;i这是不应该工作的,堆栈是按照后进先出的原则工作的,这意味着什么是最后一个先出的。您可能要寻找的是一个按照先进先出原则工作的队列。

堆栈数据结构不定义弹出第一个元素的行为。如前所述,它是一个后进先出的数据结构。内部实现尾巴在这里是不相关的(它是一个链表还是引擎盖下的其他东西)

我宁愿使用java.util.Deque,它是一个双端队列

Deque<String> deque = new LinkedList<>();

deque.push("S1");
deque.push("S2");
deque.push("S3");
deque.push("S4");
deque.push("S5");
deque.push("S6");
deque.push("S7");
deque.push("S8");

String last = deque.pollLast();
String first = deque.pollFirst();
Deque-Deque=newlinkedlist();
推压(S1);
推压(S2);
推压(S3);
推压(S4);
推压(S5);
推动(S6);
推压(“S7”);
推压(S8);
字符串last=deque.pollLast();
String first=deque.pollFirst();

如果你被一个真正的堆栈卡住了,方法是弹出所有内容并立即将其推到另一个堆栈上。这将给你一个所有内容按相反顺序排列的堆栈。然后新堆栈的顶部元素将是原始的底部元素

public-bottome元素(堆栈){
if(stack.isEmpty())抛出新的IllegalArgumentException(“空堆栈”);
//把书堆翻过来。
最终堆叠向上向下堆叠=新堆叠();
做{
upsideDownStack.push(stack.pop());
}而(!stack.isEmpty());
最终E结果=upsideDownStack.peek();
//将堆栈翻转过来。
做{
stack.push(upsideDownStack.pop());
}而(!upsideDownStack.isEmpty());
返回结果;
}

如果要从堆栈中删除底部元素,而不是只返回它并将其保留在堆栈中,只需将
upsideDownStack.peek()
更改为
upsideDownStack.pop()
,并将最后的
do
-
while
循环更改为
while
循环。

stack.size()
更改为
list.size()()-1
。这将消除错误。堆栈是后进先出的。如果要先入先出,则需要一个队列。如果要从两端删除,请使用Deque。您没有从
堆栈中删除任何内容,而是试图从
列表中删除元素。您能更清楚地解释一下您的目标吗?
第一个添加的项“在术语上是矛盾的。如果你不想要后进先出行为,为什么要使用堆栈?Java的
堆栈实际上是一个
列表
,它支持任意插入和删除顺序。
堆栈
扩展了
向量
,这是一个合适的
列表
。这不是一个内部实现细节il.@shmosel我想我在回答中没有提到java.util.Stack。我指的是一般的“Stack”数据结构。我假设你在回答问题中的代码。考虑到java没有纯后进先出堆栈,我不确定你的观点是什么。