我必须以链接列表的形式为我的一个作业实现一个堆栈。我们必须实现接口DStack
,它在push()
文件中包含方法pop()
,peek()
,isEmpty()
和LinkedList.java
。该列表将采用一系列双打作为其内容。
我仍然在努力解决的问题基本上是链接列表的push()
和pop()
方法。我不确定我所创建的节点,但这是我到目前为止的代码:
public class ListStack implements DStack{
private Node head;
private int size;
private class Node{
double d;
Node next;
public Node(){
head = null;
next = null;
}
public Node(double data){
d = data;
}
}
public boolean isEmpty() {
return (head == null);
}
@Override
public void push(double d) {
if(!isEmpty()){
Node newHead = new Node(d);
newHead.next = head;
head = newHead;
size++;
}
else
throw new EmptyStackException(); //To change body of generated methods, choose Tools | Templates.
}
@Override
public double pop() {
if(!isEmpty()){
double d = head.d;
head = head.next;
size--;
return d;
}
else
throw new EmptyStackException(); //To change body of generated methods, choose Tools | Templates.
}
@Override
public double peek() {
if(!isEmpty()){
return head.d;
}
else
throw new EmptyStackException(); //To change body of generated methods, choose Tools | Templates.
}
如果我正确使用push()
和pop()
方法,有人可以告诉我吗?如果没有,我到底需要修改它?我在网上寻找解释,但大多数材料对我来说都没有意义。
另外,我的老师禁止我们使用Java框架或其他类库中的任何其他类。这是否意味着我无法在代码中使用Iterable
?如果是这样,则不需要为remove()
,next()
等链接列表创建其他方法,对吧?
我仍在绊倒这些链接列表概念,所以如果有人能清楚这一点,我会非常感激。谢谢!
答案 0 :(得分:0)
pop()
和peek()
看起来不错,但在空堆栈上尝试push()
时,不应该抛出异常。如果是这样的话,你将永远无法使用愚蠢的东西。相反,如果它是空的,你可能想要做一些不同的事情,但在任何情况下push()
都不应该抛出EmptyStackException
。
答案 1 :(得分:0)
看起来不错,需要初始化head,否则push / pop总会抛出异常。当不可能而不是空堆栈异常时,考虑抛出堆栈完全异常。 这将是无限的列表容量,您可以考虑使用固定容量,然后推送会有限制。
答案 2 :(得分:0)
除了已经提供的建议之外 - 它为一些基本场景绘制堆栈/列表的状态提供了很多帮助:在开头,介于其中的一些元素和最后删除时最后一个元素然后逐步完成代码并检查push()和pop()的变量和指针会发生什么。
当然也可以使用调试器完成 - 但是Pen&纸张有时可以解决问题;)祝你好运!