У мене є таке домашнє завдання:
Реалізуйте методи стека push (x) та pop (), використовуючи дві черги.
Мені це здається дивним, оскільки:
- Стек - це (LIFO) чергу
- Я не бачу, для чого вам знадобиться дві черги, щоб здійснити це
Я шукав:
і знайшов пару рішень. Ось що я закінчив:
public class Stack<T> {
LinkedList<T> q1 = new LinkedList<T>();
LinkedList<T> q2 = new LinkedList<T>();
public void push(T t) {
q1.addFirst(t);
}
public T pop() {
if (q1.isEmpty()) {
throw new RuntimeException(
"Can't pop from an empty stack!");
}
while(q1.size() > 1) {
q2.addFirst( q1.removeLast() );
}
T popped = q1.pop();
LinkedList<T> tempQ = q1;
q1 = q2;
q2 = tempQ;
return popped;
}
}
Але я не розумію, у чому перевага над використанням однієї черги; версія двох черг здається безглуздо складною.
Скажімо, ми обираємо, щоб натискання були більш ефективними з 2-х (як я це робив вище), push
залишалися б однаковими і pop
просто вимагали повторення останнього елемента та повернення його. В обох випадках push
було б O(1)
і pop
було б O(n)
; але версія єдиної черги була б кардинально простішою. Він повинен вимагати лише одинарного циклу.
Я щось пропускаю? Будь-яке розуміння тут буде вдячне.