堆栈的Java实现
Java中是否有一个类实现了数据结构书中堆栈的概念,即LIFO,pop是O(1)和推入O(1) 我读了一点的代码,看起来push不是O(1)-push可以调用Vector.grow(),它可以取O(n)(我知道它摊销了O(1),但我一直在寻找push-in O(1))堆栈的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.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)的优势。