Для начала отметим, что если у вас есть очередь строк, это не особенно сложно.Общий алгоритм - это поиск в графе строк в ширину:
- Создать пустую очередь Q.
- Вставить пустую строку в Q.
- Loopдо готовности (ваше определение готово):
- Снимите с головы Q, назовите ее w.
- Напечатайте w.
- Вставьте wA, wB и wC в Q.
Проблема в том, что вы не можете вставить эти строки в очередь, не очень быстро исчерпав все свободное пространство.Тем не менее, если вам разрешено использовать несколько очередей, вы можете объединить очереди в одну гораздо большую очередь.Например, предположим, что у вас есть две очереди емкостью 3 каждая и вы хотите создать очередь емкостью 6. Чтобы сделать это, пометьте очереди как «левую очередь» и «правую очередь».По умолчанию вы вставляете в правую очередь, как показано здесь:
Left Right
[ ] [ ] [ ] [ ] [ ] [ ] Enqueue A
[ ] [ ] [ ] [ ] [ ] [A] Enqueue B
[ ] [ ] [ ] [ ] [A] [B] Enqueue C
[ ] [ ] [ ] [A] [B] [C]
Теперь предположим, что в правой очереди недостаточно места.В этом случае удалите элемент из правой очереди (это будет самый старый элемент в объединенных очередях), затем поместите его в левую очередь:
Left Right
[ ] [ ] [ ] [A] [B] [C] Enqueue D
[ ] [ ] [A] [B] [C] [D] Enqueue E
[ ] [A] [B] [C] [D] [E] Enqueue F
[A] [B] [C] [D] [E] [F]
Теперь, чтобы выполнить операцию удаления, выполнитеследующие.Во-первых, если левая очередь непуста, удалите из нее очередь;это возвращает вам самый старый элемент в связке.В противном случае, если правая очередь непуста, вместо этого удалите очередь из этой очереди.Например, вот некоторые очереди и очереди:
Left Right
[A] [B] [C] [D] [E] [F] Dequeue (yields A)
[B] [C] [ ] [D] [E] [F] Dequeue (yields B)
[C] [ ] [ ] [D] [E] [F] Dequeue (yields C)
[ ] [ ] [ ] [D] [E] [F] Dequeue (yields D)
[ ] [ ] [ ] [ ] [E] [F] Enqueue G
[ ] [ ] [ ] [E] [F] [G] Enqueue H
[ ] [ ] [E] [F] [G] [H] Dequeue (yields E)
Вы можете обобщить эту технику, объединив несколько очередей в длинную цепочку.Используя это, вы можете взять свою маленькую очередь, которая содержит всего 10 символов, и сформировать намного большую очередь, возможно, с емкостью 100 или 1000.
Так как это поможет?Ну, используя цепочечные очереди, вы можете смоделировать очередь строк!Чтобы вставить строку w, просто вставьте символы w, а затем маркер (скажем, $) в свою очередь.Например:
Long Queue Contents Operation
$ Dequeue once to get $, insert A, B, C
A$B$C$ Dequeue twice to get A$, insert AA, AB, AC
B$C$AA$AB$AC$ Dequeue twice to get B$, insert BA, BB, BC
C$AA$AB$AC$BA$BB$BC$
и т. Д.Используя эту комбинацию меньших очередей для имитации большей очереди, которая имитирует очередь строк (woohoo!), Вы можете решить проблему, используя первоначальный алгоритм.
Надеюсь, это поможет!