225. Usa colas para implementar pilas
En general, existen dos métodos:
两个
Darse cuenta con cola一个
Darse cuenta con cola
Método 1 : 两个
darse cuenta con cola
La mejor manera es dejar que las dos colas q1
( cola en la pila) y q2
(cola fuera de la pila) actúen como push-in y out-stack respectivamente, a saber:
push
Agregar elementos aq1
pop
Deq2
lospoll
elementos
q1
Y q2
solo un puntero, en push
el tiempo interno mediante el uso de una variable temporal para el intercambio q1
y q2
el punto, para que q1
y q2
apunte siempre a la cola 入栈队列
y 出栈队列
.
La ventaja de esto es que puede simplificar pop()
la top()
implementación, al igual s2
que la cola de la pila, por lo que solo debe realizarse por separado q2.poll()
y q2.peek()
puede ser.
La razón principal es push()
que la implementación es más complicada. Aquí hay algunas imágenes para ilustrar el proceso de agregar elementos:
La implementación de Java es la siguiente :
class MyStack {
private Queue<Integer> q1;
private Queue<Integer> q2;
public MyStack() {
q1 = new LinkedList<Integer>();
q2 = new LinkedList<Integer>();
}
// 只要是进栈操作就添加到q1,只要是出栈操作就从q2中poll
public void push(int x) {
q1.offer(x);
while(!q2.isEmpty()){
q1.offer(q2.poll());
}
// 通过一个临时的队列来交换q1和q2的指向
Queue<Integer> temp; // 这里只是声明一个变量,并没有开辟一个真正的队列空间
temp = q1;
q1 = q2;
q2 = temp;
}
public int pop() {
return q2.poll();
}
public int top() {
return q2.peek();
}
public boolean empty() {
return q1.isEmpty() && q2.isEmpty();
}
}
Análisis de complejidad del tiempo
- empujar()
La operación de la pila requiere q2
el n
elemento del equipo, el equipo incorporó n+1
elementos a las operaciones q1
totales 2n+1
, cada vez que un equipo en el equipo y la complejidad de las operaciones son O(1)
, por lo tanto, la complejidad del tiempo de operación de la pila O(n)
.
- La complejidad temporal de una determinada inserción depende de si la cola emergente está vacía. Si no hay una operación emergente (o el número de estallidos es mucho menor que la de push), la complejidad de casi todas las operaciones push es O (n), porque Casi todas las veces q2 no está vacío.
- El resto son
O(1)
Método 2 : 一个
darse cuenta con cola
Del mismo modo, cuando se implementa con una cola, la implementación principal se encuentra en push()
funcionamiento.
Los métodos específicos son los siguientes:
- Antes de agregar un elemento cada vez, anote el número de elementos en la cola actual como
n
- Luego ejecute para
queue.offer(x);
agregar el elemento aqueue
- El siguiente paso más soñador es poner
queue
el primern
elementopoll
enoffer
elqueue
- De esta manera, la posición actual en la parte superior del equipo debe agregarse nuevamente.
x
Aquí hay algunas imágenes para ilustrar el proceso de agregar elementos:
La implementación de Java es la siguiente :
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<Integer>();
}
public void push(int x) {
int n = queue.size();
queue.offer(x);
for (int i = 0; i < n; i++) {
queue.offer(queue.poll());
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}
Análisis de complejidad del tiempo
- empujar()
Cada push
operación le agregará n elementos nuevamente queue
, por lo que push()
la complejidad del tiempo esO(n)
- El resto son
O(1)