无法从堆栈中弹出项目

时间:2014-01-10 08:18:34

标签: java data-structures stack

我实现了一个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*

1 个答案:

答案 0 :(得分:2)

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

首次执行

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;
    }
  }
}