【问题标题】:Unable to pop item from stack无法从堆栈中弹出项目
【发布时间】:2014-01-10 08:18:34
【问题描述】:

我用如下所示的节点实现了一个 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*

【问题讨论】:

  • pop() 方法在返回布尔值后如何让您复制最后一个元素?
  • 不清楚你在问什么。也不清楚你为什么要向前看 2 个节点;当 size == 2 时,这似乎会引发 NPE。
  • @BrianRoach,我认为当 size 为 2 时,不会执行 while 并且到第二个元素的链接将被删除 -> 看起来没问题。
  • 没有他的代码是不可能的,是的。
  • @wxys 有点像这样,我在方法中包含了一些打印并用输出更新了问题

标签: java data-structures stack


【解决方案1】:

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

第一次执行

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多