2014-01-10 4 views
0

Я реализовал 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* 
+3

Как метод pop() делает копию последнего элемента, так как он возвращает логическое значение? – wxyz

+0

Непонятно, что вы просите. Также непонятно, почему вы смотрите на 2 узла впереди; похоже, что это собирается бросить NPE, когда размер == 2. –

+0

@BrianRoach, я думаю, что когда размер равен 2, while не выполняется, и ссылка на второй элемент будет удалена -> выглядит нормально. – wxyz

ответ

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; 
    } 
    } 
} 
Смежные вопросы