Как кодировать метод просмотра для связанного списка - PullRequest
3 голосов
/ 06 октября 2011

Я создаю реализацию связанного списка для стека.У меня есть метод 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 ]

3 голосов
/ 06 октября 2011

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

1 голос
/ 07 октября 2011

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

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

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

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

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

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

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

0 голосов
/ 22 апреля 2013

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

...