Вы спросили: «Кроме удаления элемента из очереди, как я могу пройти по списку или иным образом получить доступ к переднему, заднему, следующему и предыдущему, которые все находятся в ListQueue».
В чистом смысле вы не должны быть в состоянии.
Идеализированная очередь обещает только несколько вещей:
- Толкаем предметов в спину
- Поп предметы с фронта
- (возможно) Проверить лицевой элемент, если не пустой
- (возможно) предикат пространства определения для pop и inspect , определяющий, пуста ли очередь
На данный момент я предполагаю, что очередь не предназначена для использования ни с одновременными считывателями (получающими доступ к фронту одновременно), ни с одновременными считывателями и записывающими устройствами (обращающимися одновременно с задней и передней панелями).
Принимая во внимание это определение, нет причин искать «внутри» очереди. Вы кладете вещи в одну сторону, а вещи - в другую. Если вы учитываете , ограничивающий размера очереди, вам может потребоваться дополнительный предикат пространства определения для операции push , чтобы определить, заполнена ли очередь. «Быть заполненным» имеет смысл, только если очередь ограничена. «Быть пустым» имеет значение, только если поток, вызывающий pop или inspect , не хочет блокировать.
Помимо этого, существует прагматическая идея очереди. Мы можем предположить, что это последовательность элементов, которая, за исключением проблем параллелизма, имеет заметный неотрицательный размер и может даже разрешить посещение каждого элемента в последовательности. Некоторые очереди даже заходят настолько далеко, что позволяют удалять или переставлять элементы в позициях, отличных от передней части последовательности. Однако в этот момент мы больше не обсуждаем очередь. Мы обсуждаем последовательность, которая лежит в основе очереди. Если нам нужен такой доступ, нам не нужна очередь. Нам нужна последовательность, которую мы хотим предложить в виде очередей view другим частям программы.
Вот почему очереди обычно не являются конкретными типами в библиотеках структуры данных. В C ++ тип std::queue
является декоратором для некоторого другого типа контейнера. В Java java.util.Queue
- это интерфейс. Scala использует другой подход: класс scala.collection.mutable.Queue
является расширением типа MutableList
. Это похоже на подход, предусмотренный в назначении вашего сына, но неясно, намеревался ли ваш ListQueue
когда-либо позволить посторонним (включая подклассы) воспользоваться его «природой списка» - проникнуть в представление очереди, чтобы использовать последовательность внутри.
У вас есть требование, чтобы иметь возможность посещать что-либо, кроме главы вашей очереди? Необходимость сделать это ограничивает ваш выбор относительно того, какие очереди могут обслуживать ваши потребляющие функции. Похоже, что мы изучаем неправильные уроки с этим заданием.