Как кодировать метод просмотра для связанного списка

Я создаю реализацию связанного списка для стека. У меня есть метод pop и push, но я не могу понять, что метод peek правильный. Код, который у меня сейчас есть, возвращает адрес памяти, который я думаю.

Вот мой код:

public class LinkedStack<T> implements StackADT<T> {

private int count;
private LinearNode<T> contents;

public LinkedStack() {
    count = 0;
    contents = null;
}

@Override
public void push(T element) {
    LinearNode<T> top = new LinearNode<T>(element);

    if (contents == null) {
        contents = top;
    } else {
        LinearNode<T> current = contents;

        while (current.getNext() != null) {
            current = current.getNext();
        }
        current.setNext(top);
    }
    count++;
}

@SuppressWarnings("unchecked")
@Override
public T pop() {
    T item = (T) contents;
    contents = contents.getNext();
    count--;
    return item;
}

@SuppressWarnings("unchecked")
@Override
public T peek() throws NoSuchOperationException {

    T top = (T) contents;
    if(top == null){
        throw new NoSuchOperationException();
    }
    return top;
}

@Override
public boolean isEmpty() {
    // TODO Auto-generated method stub
    return false;
}

@Override
public int size() {
    return count;
}
}

Это то, что он выводит, когда я вызываю метод peek. Я использовал свой метод push для добавления объекта и протестировал его методом size. Это показало, что я добавил элемент. Затем я вызвал метод pop и снова отобразил размер, чтобы убедиться, что он работает.

Это мой вывод метода peek:

LinearNode @ 33f42b49

Вот мой класс LinearNode:

public class LinearNode<T> {
private T element;
private LinearNode<T> next;

public LinearNode() {
    this.element = null;
    this.next = null;
}
public LinearNode(T element) {
    this.element = element;
    this.next = null;
}
public T getElement() {
    return element;
}
public void setElement(T _element) {
    this.element = _element;
}
public LinearNode<T> getNext() {
    return next;
}
public void setNext(LinearNode<T> next) {
    this.next = next;
}

}

3 ответа

Похоже, классу LinearNode нужен метод toString().

pop() и peek() должны возвращать то, на что ссылается LinearNode, а не фактический LinkedNode.

@SupressWarnings указывает на то, что вы не делаете дженерики правильно. Удалите их и посмотрите, что вы возвращаете - похоже, вы возвращаете не `T', а непосредственно LinkedNode. Вам не нужно никаких предупреждений SupressWarnings в этом коде.

Если вы хотите хранить строки, то вы должны определить стек следующим образом:

LinkedStack<String> stack = new LinkedStack<String>();

Вы можете думать, что общий тип T будет представлять String внутри вашего стека класса.

В этом случае peek() сигнатура методов затем возвращает строку.

Также: проверьте ваши методы pop и push, оба должны быть в состоянии в O(1), однако вы просматриваете список. Вы получили это задом наперед.

Вы можете просто просмотреть, используя: System.out.println("Элемент сверху: " + top.getElement); и верните top.getElement. Помните, что на самом деле вы фактически удаляете Node из верхней части стека и его элемента. Поскольку peek фактически видит только верхний элемент стека, вам не нужно использовать top = top.getNext или count--;. Надеюсь, поможет!

Другие вопросы по тегам