У меня есть функция, которая принимает Queues, и я хотел бы выполнять операции над ними, как Stack. К сожалению, методы ArrayDeque, такие как addFirst, не отображаются в интерфейсе Queue, поэтому я не могу их использовать. Есть ли способ выполнить операции стека в очереди?
Благодарю!
Там есть! Отметьте asLifoQueue(Deque<T> deque)
в классе Collections. https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#asLifoQueue(java.util.Deque)
Возвращает представление Deque как очереди Last-in-first-out (Lifo). Метод add сопоставляется для push, remove отображается в pop и так далее. Это представление может быть полезно, если вы хотите использовать метод, требующий очереди, но вам нужно упорядочить Lifo.
Он возвращает новый класс, который реализует интерфейс Queue, за исключением повторения привязки методов Queue к соответствующим методам в Deque, чтобы он функционировал как стек LIFO!
Библиотека Java полна волшебных вещей, если вы их ищете!
Deque
ПРИМЕЧАНИЕ. Если вы не можете использовать подход OO, как показано ниже, просто очередь, подобную q
, и управлять очередью, как показано ниже.
Если вам нужно использовать Очередь, это достойное решение, хотя гораздо лучшим подходом будет для нас класс Stack или реализация Stack с использованием других структур данных.
public class MyStack<T> {
/**
* @param args
*/
private Queue<T> q = new LinkedList<T>();
public MyStack(){
}
public static void main(String[] args) {
MyStack<String> s = new MyStack<String>();
s.push("1");
s.push("2");
s.push("3");
s.push("4");
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
}
public void push(T s){
q.offer(s);
}
public T pop(){
int n = q.size();
for(int i = 0; i < n-1; i++){
q.offer(q.poll());
}
return q.poll();
}
}
Вывод:
4
3
2
1
ноль
MyStack
больше не является ни стеком, ни MyStack
.
Queue
не указывает, вставляются ли данные в начало или в конец. Следовательно, вы не можете знать, что вы действительно делаете в очереди.