Давайте оставим в стороне тот факт, что в вашем классе MyStack<>
вы используете двусвязный список Java на секунду.
1) Вы создали односвязный списокэто идет голова к хвосту .Затем вы реализовали add()
, который работает на конце tail . Это самая неэффективная реализация , которую вы можете сделать для стека.
Стек по своей природе - LIFO (последний вошел, первый вышел).Т.е. если вы сделаете add(1); add(2); add(3);
, тогда pop()
, вы должны получить 3
- последний добавленный вами элемент.В вашей реализации, чтобы добраться до 3, нужно пройти через 1 и 2. Теперь представьте, если у вас есть миллион предметов, и вам нужно выскочить два из них.Чтобы пройти к хвосту, нужно дважды пройти миллион элементов.
Лучшая реализация для стека, подкрепленного от головы к хвосту связанным списком, будет add
и pop
от головы .Когда вы делаете pop
, у вас уже есть последний элемент, добавленный к голове, и у вас уже есть ссылка на следующий элемент, который будет новой головой.
2) После всего этого вы приступили ксоздайте класс MyStack<>
, который использовал private LinkedList<T> stack;
для его поддержки. Это реализация двусвязного списка Java .Это должно прекрасно работать для стека, но не дает возможности выполнить ваши первые 50 строк кода по созданию реализации связанного списка самостоятельно.
3) Когда вы делаете stack.push()
, вы вызываете push()
метод в вашем классе MyStack
, который выталкивает его в список с двойной связью , упомянутый в 2) выше.
Затем вы пытаетесь распечатать stack.toString()
.В этом случае MyStack
не имеет метода toString
, поэтому он относится к своему родительскому классу SinglyLinkedList
.Но так как вы даже не коснулись односвязного списка в своем коде, он возвращается пустым, и вы ничего не получаете.
В заключение, ваша оценка, что он как-то связан с вашим MyStack
реализация находится на 100% месте.Вы смешиваете и сопоставляете класс LinkedList
Java со своим собственным классом SinglyLinkedList
;добавление значений к одному, а затем чтение другого.