剣指Offer 09-2つのスタックでキューを実現


問題の説明
2つのスタックで1つのキューを実現します.キューの宣言は以下のとおりです.2つの関数appendTailとdeleteHeadを実装し、キューの末尾に整数を挿入し、キューの先頭に整数を削除する機能をそれぞれ完了してください.(キューに要素がない場合はdeleteHead操作は-1を返します)
例1:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]][null,null,3,-1]

例2:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]][null,-1,null,null,5,2]

ヒント:
1 <= values <= 10000
     appendTail、deleteHead    10000    

問題を解く構想.
2つのスタックを維持し、1つ目のスタックは挿入操作をサポートし、2つ目のスタックは削除操作をサポートします.
スタックの先進的な特性に基づいて、最初のスタックに要素を挿入するたびに(スタックの頂上に挿入)、最初のスタックのスタックの底は最初に挿入され、最初に削除する必要がある要素であり、スタックの頂上は最後に挿入され、最後に削除する必要がある要素である.キューの先進的な先出し特性を維持するために、2番目のスタックを導入し、2番目のスタックで削除する要素を維持し、削除操作を実行するときに2番目のスタックが空であるかどうかを最初に見ます.空の場合、最初のスタックの要素を2番目のスタックにポップアップして挿入します.このように、2番目のスタックの要素の順序は削除する要素の順序であり、削除操作を実行するときは、2番目のスタックの要素を直接ポップアップして返します.
インプリメンテーションコード
class CQueue {
     
    //        s1 s2,  s1        ,s2      
    Stack<Integer> s1;
    Stack<Integer> s2;
    public CQueue() {
            //          
        s1=new Stack<>();
        s2=new Stack<>();
    }
    //             s1 
    public void appendTail(int value) {
     
        s1.push(value);         
    }
    //     ,  s2     ,     s2        。
    //  s2  ,     s1            s2  ,  
    //s2                         。
    //  ,  s1     ,  s2     ,    ,  -1,    s2    
    public int deleteHead() {
     
        if(!s2.empty()){
     
            return s2.pop();
        }else{
     
            while(!s1.empty()){
     
                s2.push(s1.pop());
            }
        }
        
        if(s2.empty()){
     
            return -1;
        }else{
       
            return s2.pop();
        }   
        
    }
}