剑指オファー#09。2つのスタックを持つキュー

トピックリンク

タイトル説明:

2つのスタックを持つキューを実装します。次のステートメントキューは、それぞれ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]

問題解決のアイデア

  最初に、タイトルで示されている例の文字列配列の意味を理解します。CQueue初期化、appendTailエンキュー、deleteHeadデキューし、デキューされた要素を返します。つまり、文字列配列は操作を記録するための命令であり、入力int配列にはエンキューする必要のある要素が含まれています。ここで出力配列に注意してください。これは、現在のキュー内の要素のステータスを参照するのではなく、各操作の戻り値のみを参照します。実際には、deleteHead戻り値のみがあります。
  2つ目は、デュアルスタックを使用して、キューをキューに入れるというアイデアを実現することです。これら2つのデータ構造の特性を明確にするために、スタックは先入れ先出しであり、キューは先入れ先出しです。明らかに、シングルスタックはキューのエンキューおよびエンキュー操作を実現できません-では、デュアルスタックの使用方法は?一例で1,2,3は、要素は最初のスタックに順番に、input今度inputはスタックの一番上から要素のスタックの一番下まで順番に3,2,1ここで、デキュー順序を実現し1,2,3、最初のスタックの要素を1つずつポップして、2番目のスタックにプッシュしますoutput。この時点outputで、スタックの一番上から一番下までの要素1,2,3が順番になっています。 、この時点でのポップの順序は1,2,3、つまり、デュアルスタックを使用してキュー操作を実現します。
  最後は、3つの機能の機能設計です。

  1. タイトルでは、初期化中に何かを行う必要がないため、コンストラクターCQueueは無視できます。
  2. 例によると、チームに入るのにappendTail戻り値は必要なく、チームに入るだけで問題ないことがわかりましたしたがって、1行のスタッキングコードを解決できます。
  3. deleteHeadデキュー操作には損失分析が必要であり、要素をデキューする必要があるだけでなく、デキューされた要素も返します。チームが空の場合は、それを返す必要があります。-1

    if-elseロジック

    1. inputおよびoutputが空の場合この時点でキューが空であることを-1示し、;を返します。
    2. それ以外の場合は、この時点でinput空であるかどうかに関係outputなく、空でない限り、outputまだ入力されていない要素があることを意味し、操作が優先されoutputます。
    3. それ以外の場合は、output空であり空ではありinputません。inputすべての要素をに押し込んでからoutput、を操作する必要がありますoutput

  今度はc ++とJavaScriptのバージョンコードを与えてください〜

c ++

class CQueue {
    
    
public:
    CQueue() {
    
    

    }
    
    void appendTail(int value) {
    
    
        input.push(value);
    }
    
    int deleteHead() {
    
    
        if(input.empty() && output.empty()) //双栈均为空
            return -1;
        else if(!output.empty()){
    
              //output栈不为空,说明还有未出队的元素
            int result = output.top();
            output.pop();
            return result;
        }
        else{
    
                                 //output栈为空,再执行删除需要input元素出栈入栈
            while(!input.empty()){
    
    
                int value = input.top();
                input.pop();
                output.push(value);
            }

            int result = output.top();
            output.pop();
            return result;
        }
        
    }
private:
    stack<int> input;
    stack<int> output;
};


JavaScript

var CQueue = function() {
    
    
    this.output = [];
    this.input = [];
};

/** 
 * @param {number} value
 * @return {void}
 */
CQueue.prototype.appendTail = function(value) {
    
    
    this.input.push(value);
};

/**
 * @return {number}
 */
CQueue.prototype.deleteHead = function() {
    
    
    const {
    
    input, output} = this;       //es6 解构赋值
    if(!output.length && !input.length){
    
    
        return -1;
    }
    else if(output.length){
    
    
        return output.pop();
    }
    else{
    
    
        while(input.length){
    
    
            output.push(input.pop());
        }
        return output.pop();
    }
};

間違いや厳しくない場合は訂正してください、ありがとうございます。
私のブログ:http//breadhunter.gitee.io

おすすめ

転載: blog.csdn.net/weixin_40807714/article/details/104958644
おすすめ