MyQueue - Verwenden Sie den Stapel, um die Warteschlange zu implementieren

Titel

Verwenden Sie nur zwei Stapel, um eine First-In-First-Out-Warteschlange zu implementieren. Die Warteschlange sollte alle von der allgemeinen Warteschlange unterstützten Vorgänge unterstützen (Push, Pop, Peek, Leer):

Implementieren Sie die MyQueue-Klasse:

void push (int x) Schieben Sie das Element x an das Ende der Warteschlange.
int pop () Entfernen Sie es vom Anfang der Warteschlange und geben Sie das Element zurück.
int peek () Geben Sie das Element am Anfang der Warteschlange zurück.
boolean empty () Wenn die Warteschlange ist leer, return true, andernfalls false

Beschreibung:

Sie können nur Standard-Stack-Operationen verwenden. Das heißt, nur Push-to-Top, Peek / Pop von oben, Größe und leere Operationen sind zulässig.

Die von Ihnen verwendete Sprache unterstützt möglicherweise keine Stapel. Sie können list oder deque (Warteschlange mit zwei Enden) verwenden, um einen Stapel zu simulieren, sofern es sich um eine Standardstapeloperation handelt.

Fortgeschrittene:

Können Sie für jede Operation eine Warteschlange mit einer amortisierten O (1) -Zeit implementieren? Mit anderen Worten, die Gesamtzeitkomplexität der Ausführung von n Operationen beträgt O (n), selbst wenn eine der Operationen lange dauern kann.

Beispiel:

Eingabe:
["MyQueue", "Push", "Push", "Peek", "Pop", "Leer"]
[[], [1], [2], [], [], []]
Ausgabe:
[null, null, null, 1, 1, false]

解释 :
MyQueue myQueue = new MyQueue ();
myQueue.push (1); // Warteschlange ist: [1]
myQueue.push (2); // Warteschlange ist: [1, 2] (ganz links vor der Warteschlange)
myQueue.peek (); // return 1
myQueue.pop (); // 1 zurückgeben, Warteschlange ist [2]
myQueue.empty (); // falsch zurückgeben

prompt:

1 <= x <= 9
Rufen Sie Push, Pop, Peek und Leer bis zu 100 Mal auf,
vorausgesetzt, alle Vorgänge sind gültig (eine leere Warteschlange ruft beispielsweise keine Pop- oder Peek-Vorgänge auf).

Verwandte Themen Stack Design

Ideen zur Problemlösung

Diese Frage ist relativ einfach. Sie müssen nur verstehen, dass der Stack einen First-In-Last-Out-Charakter hat und das Team einen First-In-First-Out-Charakter hat.
Fügen Sie hier eine Bildbeschreibung ein

Code-Demo

class MyQueue {


    Stack<Integer> stack1;
    Stack<Integer> stack2;

    /** Initialize your data structure here. */
    public MyQueue() {
        stack1=new Stack<>();
        stack2=new Stack<>();

    }
    
    /** Push element x to the back of queue. */
    public void push(int x) {
        if(!stack2.empty()) {
            while (!stack2.empty())
            {
                Integer pop = stack2.pop();
                stack1.push(pop);
            }
            stack1.push(x);
        }
        else
            stack1.push(x);
    }
    
    /** Removes the element from in front of queue and returns that element. */
    public int pop() {
        if(!stack1.empty())
        {
            while (!stack1.empty())
            {
                Integer pop = stack1.pop();
                stack2.push(pop);
            }
            Integer res = stack2.pop();
            return res;
        }
        else
            return stack2.pop();

    }
    
    /** Get the front element. */
    public int peek() {
         if(!stack1.empty())
         {
             while (!stack1.empty())
             {
                 Integer pop = stack1.pop();
                 stack2.push(pop);
             }
             return stack2.peek();
         }
         else
             return stack2.peek();
    }
    
    /** Returns whether the queue is empty. */
    public boolean empty() {
          if(!stack1.empty())
          {
              return stack1.empty();
          }
          else
              return stack2.empty();
    }
}

Effektdemonstration

Die Info-
Antwort war erfolgreich:
Ausführungszeit: 0 ms, 100,00% der Java-Benutzer besiegt
Speicherverbrauch: 36,6 MB, 12,28% der Java-Benutzer besiegt

Ich denke du magst

Origin blog.csdn.net/tangshuai96/article/details/114384039
Empfohlen
Rangfolge