トピックリンク
タイトル説明:
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つの機能の機能設計です。
- タイトルでは、初期化中に何かを行う必要がないため、コンストラクター
CQueue
は無視できます。- 例によると、チームに入るのに
appendTail
戻り値は必要なく、チームに入るだけで問題ないことがわかりました。したがって、1行のスタッキングコードを解決できます。deleteHead
デキュー操作には損失分析が必要であり、要素をデキューする必要があるだけでなく、デキューされた要素も返します。チームが空の場合は、それを返す必要があります。-1
if-elseロジック
input
およびoutput
が空の場合、この時点でキューが空であることを-1
示し、;を返します。- それ以外の場合は、この時点で
input
空であるかどうかに関係output
なく、空でない限り、output
まだ入力されていない要素があることを意味し、操作が優先されoutput
ます。- それ以外の場合は、
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