N難問

4237 ワード

nの問題は問題の名前ではありません.その背後にある推論は、ラインの後でより明確になるでしょう.

問題
問題は、2つのスタックからキューデータ構造を実装することができます尋ねている!

クイックキューとスタックの速度に!
キューとスタックは、コンピュータサイエンスの多くのような利点と欠点がありますが、この質問は、どのようなシナリオの方が良いのではなく、これらの2つのデータ構造の動作に関心があります.

キュー
私が上で話していた行動は、データが入ったり来たりする順番です.あなたが最初に入れたものは何でも、キューに入れてください.( FIFO for short )

スタック
スタックはまだデータが移動する順序を扱っていますが、少し異なります.スタックが最初に最後にある.( filo for short )
あなたがまだ少し失われている場合はうまくいけばこれらの類推はあなたを助ける.イングランドの国では、整然としたファッションで何かを待っている場合は、キューになります.あなたは最初の魚とチップを得るだろう行の最初のチャップだったかどうかを考えるときにもう少し意味を作る!今、スタックで、製造工場からディーラーまでどのように車を作るかについて考えます.車のキャリア、トレーラーで5 - 6車を運ぶことができる巨大なトラック.それはあなたが最初の車を取ることは不可能ですので、あなたは最初の最後の1つを取る必要があります.

問題へ戻る
それで、我々が部品のより良い把握がある今、問題は現れます.あなたの足に速いことはあなたの専門知識の一つです.結局のところ、あなたはエンジニアであるか、少なくともあなたのdamnedestしようとする.それで、配列の考えはあなたのブライアン考えに忍び込みます.あなたはため息をつき、ホワイトボードをヒットするためにメーカーを拾う(2020年の改正、ホワイトボードだけであなたの子供の寝室はありません.あなたがインタビュアーをするように、彼の電話から見上げないで、あなたはカンニングをすることができなくて、配列を使うことができないと言います.ANNNNNNDDDDD我々は、フリークアウトに戻ります.
それで、我々には2つのスタックがあります、そして、それらのスタックはデータに対処します!この点で、私はこの例のために私のインタビュアーを尋ねるでしょう、私は有限集合のデータを使うことができました.(3文字のような)ので、より良い理解のための図を作成することができます.

必要な方法
我々が実装する必要があるメソッドは、追加、削除、およびピークです.これらのメソッドはキューのプロパティである必要があります.

ジャストワンモア
我々が行く前に、我々は2つのスタックを必要とします.スタックを持っていない限り、2つのスタックからキューを作ることはできません.
 constructor() {
        this.a = new Stack();
        this.b = new Stack();
    }

addメソッド
Addメソッドには1つの目的があります.すべてのことは、この機能を行っているデータを取って、最初のスタックまたはこの場合のスタックに配置されます.以下のようになります.
  add(record) {
        this.a.push(record);
    }

removeメソッド
Removeメソッドは、少なくとも私のためのBrainPowerでのステップアップです.何が本当に起こっていたか、そして、なぜ我々がそれをしていたかについて理解するために、私はしばらくかかりました!それがどのように分解するかは、ここにあります.まず最初に、「スタックAにはどんな要素がありますか?」というループがありますその質問に対する答えがはいであるならば、我々はその値を望みます、そして、スタックBにその値を押してください.このwhileループでは、スタックBに要素があるかどうかをチェックします.もしあれば、その要素をスタックAに戻し、必要な値を返します.コードは次のようになります.
 remove(){
        while (this.a.peek()) {
            this.b.push(this.a.pop());
        }
        const record = this.b.pop();

        while (this.b.peek()) {
            this.a.push(this.b.pop());
        }

        return record;
    }

ピーク法
PEEK方法は、1つの違いだけで非常に類似しています.ポップされた値ではなく、返り値はpeekedされます.
コードは次のようになります.
 peek(){
        while (this.a.peek()) {
            this.b.push(this.a.pop());
        }
        const record = this.b.peek();

        while (this.b.peek()) {
            this.a.push(this.b.pop());
        }

        return record;
    }

n?
この場合、私はビッグO表記を参照していません.これはクレイジーに聞こえるかもしれませんが、実際には文字自体、特に小文字nを参照しています.
The letter in question
絵を引いてください、そして、私は私が何を見るかについて、あなたに話します.それで、さらにこれを壊すために、私はこの問題が2つの部分を持つと言います.スタックへのデータの追加と、1つのスタックから別のスタックへのデータの移動.PeekとRemoveは私が彼らにそれらの両方からのリターンで得る同じsansを考慮するように類似しています.文字の左上にデータを追加します.必要な情報のすべては、スタックA、最初の行ダウンです.次に、いずれかのピークまたは削除すると、次のスタックと背面には、アーチの両方の行を接続するデータを移動する必要があります.あなたの覗きとポップ記録は、データがNを完了する際に来た同じ点から出てきます.
私は、私がショーを持っている奇妙なダイアグラムは、あなたが再びこの問題を参照するときに少し理解を与えることを望む!
ありがとう、マイク