我正在通过使用eclipse阅读java语言中的树实现... 我发现需要实现推送和流行方法......以下是我老师实施的两种方法:
public class LimitedStack<E> {
private Node<E> first; // refererar till första elementet i listan
private Node<E> last; // refererar till sista elementet i listan
private int size; // antal element i listan
private int maxSize; // maximalt antal tillåtna element i listan
public LimitedStack(int maxSize) {
first = last = null;
size = 0;
this.maxSize = maxSize;
}
public void push(E x) {
Node<E> n = new Node<E>(x);
if (first == null) {//no overflow in this case
first = n;
size++;
} else { // add new node to front
n.next = first;
first = n;
if (size == maxSize) { //overflow, at least two elements
Node<E> p = first;
while (p.next.next != null) { //lookup second last
p = p.next;
}
p.next = null; //remove last from list
} else { //no overflow, increase size
size++;
}
}
}
public E pop() {
if (size == 0) {
return null;
}
E temp = first.element;
first = first.next;
size--;
return temp;
}
}
当我自己实施这些方法时,我确实喜欢这样:
public void push(E x) {
if(first == null) {
first = new Node<E>(x);
} else if (size==maxSize) {
Node<E> act = first;
last =null;
first = new Node<E>(x);
first.next=act;
} else {
Node<E> act = first;
first = new Node<E>(x);
first.next=act;
}
size++;
}
public E pop() {
if(size == 0) {
return null;
} else {
Node<E> act = first;
first = act.next;
return act.element;
size--;
}
}
如果我将其与老师的答案进行比较,我的实施是否正确?
由于
答案 0 :(得分:0)
不,这不正确。在pop函数中返回语句后减小大小。
答案 1 :(得分:0)
这不正确。
在push()
中,您将其分为3个条件。
您的代码将在第二个条件下失败。当链接列表已满时,根据老师的回答,您应该将新元素推入列表,删除列表中的最后一个元素和链接的大小列表未经修改。
在您的代码中,您没有删除最后一个元素。您将last设置为null 但是您从未将last设置为正确值而不是null 。由于您将size
置于size++
之外,因此链接列表的if else
仍会增加。
所以push()
的代码应该是这样的:
public void push(E x) {
Node<E> newNode = new Node<E>(x);
if(first == null) {
first = newNode;
size++;
} else if (size==maxSize) {
Node<E> act = first;
// last =null;
first = newNode;
first.next=act;
} else {
Node<E> act = first;
first = newNode;
first.next=act;
size++;
}
}
以及您的pop()
功能。您实际上可以看到您的代码与教师的代码非常相似。但是,您需要将size--;
放在return act.element;
之前,因为当该方法执行return
语句时, 将退出方法并返回调用方,至少在你的代码中。
正如@SashaSalauyou所说,这不是一棵树,它现在只是一个链表,你至少应该向你的test codes
和push()
写一些pop()
来查看是否你的链表是否正确。例如,您可以尝试推送一些值并在main
中弹出一些值,并使用调试器检查链表是否正常工作。