2015-04-13 6 views
0

У меня возникли проблемы, реализующей stack через single linked list:Реализация стека через единый связанный список

Вот интерфейс я уверен, реализации:

public interface Stack<E> { 

    /** 
    * element at the top without removing it 
    */ 
    public E peek(); 

    /** 
    * pop from the stack 
    */ 
    public void pop(); 

    /** 
    * insert into the stack 
    */ 
    public void push(E e); 

    /** 
    * isEmpty 
    */ 
    public boolean isEmpty(); 

    /** 
    * size 
    */ 
    public int size(); 

    /** 
    * reverse 
    */ 
    public Stack<E> reverse(); 

} 

и вот моя реализация:

public class ListStack<E> implements Stack<E> { 

    private static class Node<T> { 
     private T item; 
     private Node<T> next; 

     private Node(T item, Node<T> next) { 
      this.item = item; 
      this.next = next; 
     } 
    } 

    private Node<E> first; 
    private int size; 


    public ListStack() { 
     this.size = 0; 
     this.first = null; 
    } 

    @Override 
    public E peek() { 
     return first.item; 
    } 

    @Override 
    public void pop() { 
     first = first.next; 
     size--; 
    } 

    @Override 
    public void push(E e) { 

     Node<E> node = new Node<E>(e, first); 
     first = node; 
     size++; 
    } 

    @Override 
    public boolean isEmpty() { 

     return (first == null); 
    } 

    @Override 
    public int size() { 

     return size; 
    } 

    @Override 
    public Stack<E> reverse() { 

    } 

} 

Я борюсь с методом reverse, и я не уверен, что я программирую это право.

Любая помощь была бы принята с благодарностью!

+0

Не могли бы вы привести пример ввода и неисправный выход вместе с желаемым выходом? Или объяснение того, как обратный метод закручивается. –

+0

@ JonnyHenly на самом деле я просто заметил, что для любого типа вставленных данных стек всегда равен нулю, так что, возможно, что-то там не так, я просто не знаю, где – laker001

+0

взгляните на ваш метод pop, если он не установил временную переменную, чтобы удерживать E, а затем установить сначала равную следующей, а затем вернуть временную E? –

ответ

1

Чтобы отменить существующий стек, вам нужно только следовать указаниям Node.next вашего существующего стека и нажимать элементы на новом стеке.

@Override 
public Stack<E> reverse() 
{ 
    ListStack<E> reversed = new ListStack<E>(); 

    Node<E> node = first; 
    while(node != null) 
    { 
     reversed.push(node.item); 
     node = node.next; 
    } 

    return reversed; 
} 
+0

Спасибо, просто я знаю, что мои другие методы в порядке? – laker001

+0

Да, они выглядят правильно. – Ma3x

Смежные вопросы