gpt4 book ai didi

java - 无法从堆栈中弹出项目

转载 作者:行者123 更新时间:2023-12-02 06:20:57 26 4
gpt4 key购买 nike

我实现了一个带有如下所示节点的 SLL

public class StudentNode<T>
{
private StudentNode<T> next;
private T std;

public StudentNode(T s)
{
this.std=s;
this.next=null;
}

public StudentNode()
{
this.std=null;
this.next=null;
}

public T getStudent()
{
return this.std;
}

public void setNext(StudentNode<T> ln)
{
this.next = ln;
}

public StudentNode<T> getNext()
{
return this.next;
}
}

我必须使用SLL来模拟堆栈(lifo结构)

public class LinkedStack<T> {

private int size;
private StudentNode<T> head;
/* methods */
public boolean pop()
{
if (getSize()>1) {
StudentNode<T> ss=this.head;
for(StudentNode<T> sb=ss;sb!=null;sb=sb.getNext())
System.out.println(((Student)sb.getStudent()).avg());//prints the grade
while(ss.getNext().getNext()!=null){
ss=ss.getNext();
}
ss.setNext(null);
this.size-=1;
for(StudentNode<T> sb=this.head;sb!=null;sb=sb.getNext())
System.out.println(((Student)sb.getStudent()).avg()+"*");
return true;
}
else
if(getSize()==1){
this.head=null;
return true;
}
return false;
}
}

我必须弹出列表的最后一个元素,但它似乎为我制作了它的副本而不是切断它。我在这里错过了什么?

第一次执行:

5.0
10.0
2.0
5.0
4.0
5.0*
10.0*
2.0*
5.0*

第二次执行:

5.0
10.0
2.0
5.0
5.0
4.0
5.0*
10.0*
2.0*
5.0*
5.0*

最佳答案

首先,你的输出对我来说似乎是正确的。鉴于我猜测您的代码的意图:从链接列表中删除最后一个元素。如果我重新格式化您的输出,我会得到以下结果:

第一次执行

before  | after
5.0 5.0*
10.0 10.0*
2.0 2.0*
5.0 5.0*
4.0

第二次执行

before   | after
5.0 5.0*
10.0 10.0*
2.0 2.0*
5.0 5.0*
5.0 5.0*
4.0

因此,在这两种情况下,最后一个元素都会被删除。 (顺便说一句,您忘记更新 elseif 分支中的大小)。

其次,弹出堆栈的目的通常是删除顶部元素,即头部。不是像您当前的实现那样的底部元素。考虑到这一点,您的实现可以归结为:

public class LinkedStack<T> {

private int size;
private StudentNode<T> head;
/* methods */
public boolean pop()
{
if (this.size > 0) {
this.head = this.head.getNext();
this.size--;
return true;
} else {
return false;
}
}
}

关于java - 无法从堆栈中弹出项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com