トピック:
2つのスタックでキューを実装します。キューの宣言は次のとおりです。appendTailとdeleteHeadの2つの関数を実装してください。キューの末尾に整数を挿入する機能と、キューの先頭にある整数を削除する機能をそれぞれ完了します。(キューに要素がない場合、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<=値<=10000
- appendTail、deleteHeadに対して最大10000回の呼び出しを行います
問題解決のアイデア:
スタックはキュー機能を実装できません。スタックの一番下にある要素(キューの最初の要素に対応)を直接削除することはできず、上のすべての要素をスタックからポップアウトする必要があります。
ダブルスタックは、リストの逆の順序を実現できます。3つの要素を持つスタックA = [1、2、3]と、空のスタックB=[]があります。A要素がスタックからポップされてスタックAが空になるまでスタックBに追加される場合、A = []、B = [3、2、]、つまり、スタックBの要素は逆の順序を実装します。スタックAの要素の。
スタックBを使用して、チームの最初の要素を削除します。逆の順序でBがポップを実行すると、Aのスタックの一番下の要素、つまりチームの対応する最初の要素を削除するのと同じです。
機能設計:
タイトルは、キューの最後に追加するappendTail()とキューの先頭を削除するdeleteHead()の2つの関数の通常の操作のみを必要とします。したがって、キューの末尾を追加するためのスタックAを設計し、スタックすることができます。キュー要素の先頭を削除するために要素を反転するためのB。
- キューの最後にappendTail()関数を追加します。スタックAに数値valを追加します。
- チームヘッドのdeleteHead()関数を削除します。次の3つの状況があります。
①スタックBが空でない場合でも、Bには反転された要素が残っているため、Bのスタックの一番上の要素が直接返されます。
②それ以外の場合、Aが空の場合、つまり両方のスタックが空で要素がない場合は、-1を返します。
③それ以外の場合は、スタックAのすべての要素をスタックBに転送し、要素の逆の順序を実現して、スタックBの一番上の要素を返します。
コード:
class CQueue {
var stack1: [Int] = []
var stack2: [Int] = []
init() {
}
func appendTail(_ value: Int) {
stack1.append(value)
}
func deleteHead() -> Int {
if stack2.isEmpty {
while let item = stack1.popLast() {
stack2.append(item)
}
}
return stack2.popLast() ?? -1
}
}
复制代码