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

时间:2017-02-15 18:36:28

标签: 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>();
        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);
        }


    }

}

谢谢。

3 个答案:

答案 0 :(得分:0)

如果您坚持使用真正的堆栈,那么执行此操作的方法是弹出所有内容并立即将其推送到另一个堆栈。这将为您提供一个包含所有内容的堆栈。然后新堆栈的顶部元素将是原始底部元素。

public E bottomElement(Stack<E> stack) {
    if (stack.isEmpty()) throw new IllegalArgumentException("empty stack");

    // Flip the stack over.
    final Stack<E> upsideDownStack = new Stack<E>();
    do {
        upsideDownStack.push(stack.pop());
    } while (!stack.isEmpty());

    final E result = upsideDownStack.peek();

    // Flip the stack back over.
    do {
        stack.push(upsideDownStack.pop());
    } while (!upsideDownStack.isEmpty());

    return result;
}

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

答案 1 :(得分:-1)

这不应该起作用,一个堆栈按照LIFO原则工作,这意味着最后出现的最后一个。您可能正在寻找的是一个符合FIFO原则的队列

答案 2 :(得分:-1)

堆栈数据结构未定义弹出第一个元素的行为。如上所述,它是一种LIFO数据结构。内部实施细节与此无关(是链接列表还是其他内容)。

我宁愿使用java.util.Deque,它是Double Ended Queue。

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();