[LeetCode] 232. Implémenter la file d'attente à l'aide de piles (C ++)


Source de la question: https://leetcode-cn.com/problems/implement-queue-using-stacks/

Description du titre

Veuillez n'utiliser que deux piles pour implémenter une file d'attente premier entré, premier sorti. La file d'attente doit prendre en charge toutes les opérations prises en charge par la file d'attente générale (push, pop, peek, vide):

Implémentez la classe MyQueue:

void push (int x) Pousser l'élément x à la fin de la file d'attente
int pop () Supprimer du début de la file d'attente et retourner l'élément
int peek () Renvoyer l'élément au début de la file d'attente
booléen vide () Si la file d'attente est vide, retourne true; sinon, retourne false

Remarque:
Vous ne pouvez utiliser que des opérations de pile standard, c'est-à-dire que les opérations de poussée uniquement vers le haut, d'aperçu / pop de haut, de taille et de vide sont autorisées.
La langue que vous utilisez peut ne pas prendre en charge les piles. Vous pouvez utiliser list ou deque (double queue) pour simuler une pile, à condition qu'il s'agisse d'une opération de pile standard.

Avancé:
pouvez-vous implémenter une file d'attente avec un temps amorti O (1) pour chaque opération? En d'autres termes, la complexité temporelle totale de l'exécution de n opérations est O (n), même si l'une des opérations peut prendre du temps.

Idée générale

  • Utilisez deux piles pour simuler le fonctionnement de base de la file d'attente, et il est nécessaire de rendre l'opération de complexité en temps amorti comme O (1) autant que possible,
  • Vous pouvez d'abord faire en sorte que l'ordre et le nombre d'éléments dans une pile représentent l'ordre et le nombre d'éléments dans la file d'attente actuelle, puis lorsque vous obtenez le premier élément de la file d'attente , affichez tous les éléments de la pile et utilisez une autre pile pour charger each out Les éléments de la pile, vous pouvez faire l'ordre des éléments de la file d'attente lorsque l'autre pile prend le premier élément du haut à ce moment

File d'attente de simulation de pile

class MyQueue {
    
    
public:
    stack<int> front;
    stack<int> back;
    MyQueue() {
    
    }
    
    void push(int x) {
    
    
        front.push(x);
    }
    
    int pop() {
    
    
        int ans = peek();
        back.pop();
        return ans;
    }
    
    int peek() {
    
    
    	// 需要时我再进行栈中元素的移动
        if(!back.empty())   return back.top();
        else{
    
    
            while(!front.empty()){
    
    
                back.push(front.top());
                front.pop();
            }
        }
        return back.top();
    }
    
    bool empty() {
    
    
    	// 此处少进行多次判断,可降低ms
        return (front.empty() && back.empty());
    }
};

Analyse de complexité

  • Complexité temporelle: O (1). Lors de l'exécution d'opérations pop ou peek, si la pile (verso) est vide, tous les éléments de l'avant sont déplacés, sinon il s'agit d'une complexité temporelle O (1). On peut voir que dans n fois pop ou top, il y a 1 temps O (n) Opération de relocalisation, les n-1 fois O (1) restants sont une complexité de temps O (1), donc la complexité de temps est amortie à O (1)
  • Complexité spatiale: O (n). Conservez deux piles, le nombre maximum d'éléments dans une seule pile est aussi long que la quantité de données push

Je suppose que tu aimes

Origine blog.csdn.net/lr_shadow/article/details/114390559
conseillé
Classement