Serie LeetCode "pila de implementos con cola"

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
  • popDe q2los pollelementos

q1Y q2solo un puntero, en pushel tiempo interno mediante el uso de una variable temporal para el intercambio q1y q2el punto, para que q1y q2apunte siempre a la cola 入栈队列y 出栈队列.

La ventaja de esto es que puede simplificar pop()la top()implementación, al igual s2que 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:

Inserte la descripción de la imagen aquí

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

  1. empujar()

La operación de la pila requiere q2el nelemento del equipo, el equipo incorporó n+1elementos a las operaciones q1totales 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.
  1. El resto sonO(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 comon
  • Luego ejecute para queue.offer(x);agregar el elemento aqueue
  • El siguiente paso más soñador es poner queueel primer nelemento pollen offerelqueue
  • 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

  1. empujar()

Cada pushoperación le agregará n elementos nuevamente queue, por lo que push()la complejidad del tiempo esO(n)

  1. El resto sonO(1)

Supongo que te gusta

Origin blog.csdn.net/weixin_44471490/article/details/110648782
Recomendado
Clasificación