У меня следующий домашний вопрос:
Реализуйте методы стека 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)
; но версия с одной очередью была бы значительно проще. Это должно потребовать только один цикл.
Я что-то пропустил? Любое понимание здесь будет оценено.