Задать вопрос
@iskateli

Как происходит связывание с предыдущим узлом в LinkedStack?

Контекст из книги Брюс Эккель "Философия Java" (стр.507-508):

Вместо использования LinkedList мы также могли реализовать собственный механизм внутреннего хранения данных.


public class LinkedStack<T> { 
 private static class Node<U> {
   U item;
   Node<U> next;
   Node() { item = null; next = null; }
   Node(U item, Node<U> next) { 
     this.item = item; 
     this.next = next;
   }
   boolean end() { return item == null && next == null; }
}
 private Node<T> top = new Node<T>(); // Сторож 
 public void push(T item) { 
   top = new Node<T>(item, top);
}
 public T pop() {
   T result = top.item;
   if(!top.end()) 
     top = top.next; 
   return result;
}
public static void main(String[] args) {
   LinkedStack<String> lss = new LinkedStack<String>(); 
   for(String s : "Phasers on stun!".split(" ")) 
      lss.push(s);
   String s;
   while((s = lss.pop()) != null)
   System.out.println(s));
}
}
 /* Output:
stun!
on
Phasers

В этом примере для определения пустого стека используется сторож (end sentinel).
Сторож создается при конструировании LinkedStack, и при каждом вызове push()
новый узел Node создается и связывается с предыдущим узлом Node.


Есть несколько вопросов по коду:
1. Зачем нужно создавать так называемого "сторожа" private Node<T> top = new Node<T>(); если всё равно при вызове метода lss.push(s); внутри него создаётся объект с таким же именем?top = new Node<T>(item, top);

2. Как вновь созданный новый узел связывается с предыдущим узлом, если в методе
public void push(T item) { 
   top = new Node<T>(item, top);
}

второй параметр topявляется ссылкой на самого себя top = new Node<T>(item, top); ?
но по если смотреть по структуре класса это же должен быть следующий
Node<U> next
  • Вопрос задан
  • 75 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Vamp
@Vamp
1. Просто чтобы продемонстрировать использование паттерна sentinel value. В данном конкретном примере можно было обойтись просто null.

2. В присваивании сначала выполняется правая часть - создаётся объект Node, которому в аргументы конструктора передается item и текущее значение, хранящееся в переменной top. После этого переменной top присваивается ссылка на этот новый объект.

Это более короткий вариант следующего кода:
Node<T> oldTop = top;
top = new Node<T>(item, oldTop);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы