剣指Offer 09-2つのスタックでキューを実現
問題の説明
2つのスタックで1つのキューを実現します.キューの宣言は以下のとおりです.2つの関数appendTailとdeleteHeadを実装し、キューの末尾に整数を挿入し、キューの先頭に整数を削除する機能をそれぞれ完了してください.(キューに要素がない場合はdeleteHead操作は-1を返します)
例1:
例2:
ヒント:
問題を解く構想.
2つのスタックを維持し、1つ目のスタックは挿入操作をサポートし、2つ目のスタックは削除操作をサポートします.
スタックの先進的な特性に基づいて、最初のスタックに要素を挿入するたびに(スタックの頂上に挿入)、最初のスタックのスタックの底は最初に挿入され、最初に削除する必要がある要素であり、スタックの頂上は最後に挿入され、最後に削除する必要がある要素である.キューの先進的な先出し特性を維持するために、2番目のスタックを導入し、2番目のスタックで削除する要素を維持し、削除操作を実行するときに2番目のスタックが空であるかどうかを最初に見ます.空の場合、最初のスタックの要素を2番目のスタックにポップアップして挿入します.このように、2番目のスタックの要素の順序は削除する要素の順序であり、削除操作を実行するときは、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();
}
}
}