Стек с использованием двойного списка - PullRequest
0 голосов
/ 04 апреля 2011

Эй.Мне поручили работать со стеком, используя двойной список, и я столкнулся с проблемой.Я не могу связаться с предыдущим элементом (хотя у меня не было проблем с использованием одной ссылки).

class Node
{
    Data data;
    Node previous;
    Node next;
}

class Data
{
    int     size;
    double  price;
    boolean isOnOffer;
    char    sex;
    String  brand;

    Data(int size, double price, boolean isOnOffer, char sex, String brand){
        this.size       = size;
        this.price      = price;
        this.isOnOffer  = isOnOffer;
        this.sex        = sex;
        this.brand      = brand;
    }
}

class Stack
{
    private static int sizeOfStack;
    private static Node topElement;

    public static boolean isEmpty() { return topElement == null; }

    public static void Initialize() {
        sizeOfStack = 0; 
        topElement = null; 
    }

    public static void Push(Data x) {

        Node oldElement = topElement;
        topElement = new Node();
        topElement.data = x;
        topElement.next = oldElement;
        topElement.previous = null;
        //oldElement.previous = topElement; // <----- problem here

        sizeOfStack++;
    }

    public static void Pop() {
        if (!isEmpty()){
            topElement = topElement.next;   // delete first node
            sizeOfStack--;
        }
    }

    public static void Top() {
        int size =           topElement.data.size;
        double price =       topElement.data.price;
        boolean isOnOffer =  topElement.data.isOnOffer;
        char sex =           topElement.data.sex;
        String brand =       topElement.data.brand;
        System.out.println(size + " " + price + " " + isOnOffer + " " + sex + " " + brand);
    }

    public static void Kill() { }
    public static void Print() { }


    public static void main(String[] args){

        Push(new Data(37, 155, false, 'F', "Nike"));
        Push(new Data(38, 140, true, 'F', "Reebok"));
        Push(new Data(35, 160.99, false, 'F', "Converse"));
        Push(new Data(35, 20.99, true, 'F', "Inkaras"));
        Pop();
        Pop();

        Top();
    }

}

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

// oldElement.previous = topElement; // <----- проблема здесь </p>

Как уже указывалось: если oldElement равно нулю, вы получите исключение NullPointerException. Проверьте на нулевое значение раньше, например if(oldElement != null) { oldElement.previous = topElement; }.

Также обратите внимание, что метод Top() не будет работать для пустого стека, он бросит NPE в первой строке topElement.data....

0 голосов
/ 04 апреля 2011

Посмотрите на разные случаи:

{Stack} //Top of stack is the leftmost node

[Node(Next|Prev)]

Дело: # 1 "случай с пустым стеком"

{null}

Push:

[Node1(null|null)]

Дело: # 2 "нормальное дело"

{[Node1(null|null)]}

Push:

[Node2(Node1|null)]

Change:

[Node1(null|null)] -> [Node1(null|Node2)]

Глядя на дело № 3, мы видим, что оно похоже на дело № 2, не нужно реализовывать

{[Node2(Node1|null)],[Node1(null|Node2)]}

Push:

[Node3(Node2|null)]

Change:

[Node2(Node1|null)] -> [Node2(Node1|Node3)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...