堆栈的Java实现

堆栈的Java实现,java,data-structures,stack,time-complexity,Java,Data Structures,Stack,Time Complexity,Java中是否有一个类实现了数据结构书中堆栈的概念,即LIFO,pop是O(1)和推入O(1) 我读了一点的代码,看起来push不是O(1)-push可以调用Vector.grow(),它可以取O(n)(我知道它摊销了O(1),但我一直在寻找push-in O(1)) 我想了解为什么java.util.Stack是按原样设计的,而不是按Stack的理论原理设计的,或者是哪个实现接口,这个接口有类似堆栈的方法pop和push。因为LinkedList和ArrayDeque实现了这个接口,所以我们可

Java中是否有一个类实现了数据结构书中堆栈的概念,即LIFO,pop是O(1)和推入O(1)

我读了一点的代码,看起来push不是O(1)-push可以调用Vector.grow(),它可以取O(n)(我知道它摊销了O(1),但我一直在寻找push-in O(1))


我想了解为什么java.util.Stack是按原样设计的,而不是按Stack的理论原理设计的,或者是哪个实现接口,这个接口有类似堆栈的方法
pop
push
。因为
LinkedList
ArrayDeque
实现了这个接口,所以我们可以像使用
堆栈一样使用它们

Deque
的文档中:

Deques还可以用作后进先出(后进先出)堆栈。此接口应优先于遗留堆栈类使用。当deque用作堆栈时,从deque的开头推送和弹出元素

因此,正如您所看到的,
Deque
的实现应该优先于遗留的
Stack
类。

tl;博士
  • 避免
  • 使用
堆栈
现在是遗留代码 该类现在是从另一个旧类扩展而来的。您不应该使用这些类。你也不应该把它们当作光辉的榜样来研究

Java集合框架 这两类课程在二十年前都被英国政府所取代

对于行为,您应该查看实现and的类

该接口在许多与Java捆绑的类中实现

  • 抽象队列
  • 阵列锁定队列
  • 阿莱德克
  • ConcurrentLinkedEque
  • ConcurrentLinkedQueue
  • 延迟队列
  • LinkedBlockingDeque
  • LinkedBlockingQueue
  • 链接列表
  • 链接传输队列
  • 优先阻塞队列
  • 优先队列
  • 同步队列
您可能会在第三方库的其他地方发现LIFO集合

LinkedList

如前所述,首先考虑的是O(1)的行为,如

< P>优于<>代码> 因为它由一个数组支持,而不是将单个元素存储在单独的节点实例中,所以它的性能要高得多

根据《LinkedList
的作者Josh Bloch的说法,在:

有人真的使用LinkedList吗?我写的,我从来没有用过

ArrayDeque可以生成很好的堆栈、队列或deque


堆栈或队列都可以通过Linkedlist实现

pop():从堆栈中删除顶部项

public class MyStack<T> {

   private StackNode<T> top;
    private static class StackNode<T> {

        private T data;
        private StackNode<T> next;

        public StackNode(T data) {
            this.data = data;
        }
    }

    public T pop() {
        if (top == null) throw new EmptystackException();
        T item = top.data;
        top = top.next;
        return item;
    }

    public void push(T item) {

        StackNode<T> t = new StackNode<T>(item);
        t.next = top;
        top = t;
    }
}
push():将项目添加到堆栈顶部

public class MyStack<T> {

   private StackNode<T> top;
    private static class StackNode<T> {

        private T data;
        private StackNode<T> next;

        public StackNode(T data) {
            this.data = data;
        }
    }

    public T pop() {
        if (top == null) throw new EmptystackException();
        T item = top.data;
        top = top.next;
        return item;
    }

    public void push(T item) {

        StackNode<T> t = new StackNode<T>(item);
        t.next = top;
        top = t;
    }
}
公共类MyStack{
私有StackNode-top;
私有静态类StackNode{
私有T数据;
私有StackNode-next;
公共堆栈节点(T数据){
这个数据=数据;
}
}
公共广播电台{
if(top==null)抛出新的EmptystackException();
T项=顶层数据;
top=top.next;
退货项目;
}
公共无效推送(T项){
StackNode t=新的StackNode(项目);
t、 下一个=顶部;
top=t;
}
}

堆栈是一种线性数据结构。它在后进先出机制下工作,有3个基本操作:Pop()、Push()和peek()。推送和弹出操作只能在称为top的一端执行。peek()操作是在堆栈中显示元素。 下面是堆栈的JAVA实现。我们将存储在堆栈中的数据类型是String

当堆栈已满时,称为“溢出”,当堆栈为空时,称为“下溢”

public class StackOfString {

int top = -1;
String[] myStack;

public StackOfString() {
    this.myStack = new String[5];
}

public void pop() {
    if (top != -1) {
        System.out.println("Item to be Poped: " + myStack[top]);
        myStack[top] = null;
        top -= 1;
    } else {
        System.out.println("Stack is UNDERFLOW!!!");
    }
}

public void push(String str) {
    if (isFull()) {
        top += 1;
        myStack[top] = str;
    }else {
        System.out.println("Stack is OVERFLOW!!!");
    }
    

}

public boolean isFull() {
    if (top < (myStack.length -1)) {
        return true;
    } else {
        return false;
    }
}

public void peek() {
    for (String string : myStack) {
        if (string != null)
            System.out.println(string);
    }
}}

这是输出:


您可以使用节点编写自己的代码,就像100行codeRe:update一样,请“我想了解java.util.Stack为什么按原样设计”您想了解设计的哪一部分?记住:Stack是一个非常古老的类;从那时起,对类设计的理解有了很大的发展,因此部分答案(无论你问的是设计的哪一部分)是“因为他们当时还不太了解”。Javadoc(部分)指出,这个类在用作堆栈时可能比
堆栈
更快,当用作队列时比
LinkedList
快。@ElliottFrisch“…当用作队列时比LinkedList快”但这个问题是关于将其用作堆栈(LIFO),所以我不确定这句话是否适用于这里,因为第一部分是关于
java.util.stack
,第二部分是关于队列(表示FIFO-如果我没弄错的话).@Pshemo A deque是一个双端队列;e、 g.它既是后进先出
堆栈
又是先进先出
队列
,这取决于你如何使用它。@ElliottFrisch只是想说清楚,我并不是说LinkedList比ArrayQueue好。我的观点是,尽管deque也可以用作后进先出(LIFO),但引用的部分只是将其用作队列(FIFO)的优势。