用兩個棧實現(xiàn)隊列
題目描述
用兩個棧實現(xiàn)一個隊列皇钞。隊列的聲明如下,請實現(xiàn)它的兩個函數(shù) appendTail 和 deleteHead 烘绽,分別完成在隊列尾部插入整數(shù)和在隊列頭部刪除整數(shù)的功能襟己。(若隊列中沒有元素探赫,deleteHead 操作返回 -1 )
示例:
輸入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
輸出:[null,null,3,-1]
輸入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
輸出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多會對 appendTail、deleteHead 進行 10000 次調(diào)用
題目分析
往隊尾加元素這個很簡單嘱能,只要往一個棧里面push元素就好了吝梅,這題的重點在于從一個棧里面拿出隊頭元素;
對于一個棧來說惹骂,逐個pop的結(jié)果序列就是從尾到頭苏携,把這個結(jié)果序列再放進一個棧里面,這個棧就是第一棧的鏡像棧(從頭到尾)对粪,第二個棧的pop就是取出第一個棧的隊頭元素右冻,用這兩個棧就可以實現(xiàn)基本的隊列了;
這題思路就是上面那樣著拭,代碼的具體實現(xiàn)還有一個小問題纱扭,就是什么時候?qū)⒌谝粋€棧的元素逐個pop到第二個棧里,我的實現(xiàn)是這樣的:如果需要取隊頭元素儡遮,就去第二個棧取乳蛾,如果第二個棧空了,就把第一個棧的元素鏡像到第二個棧里肃叶,如果第二個棧還是空蹂随,就返回-1,而push元素的話只需要往第一個棧push就好因惭,和第二個棧無關(guān)
拓展一下岳锁,如果要取出這個隊列里的所有元素,就需要逐個把第二個棧里的元素pop到第一個棧里面蹦魔。
class CQueue() {
val stackInput = Stack<Int>()
val stackOutput = Stack<Int>()
fun appendTail(value: Int) {
stackInput.push(value)
}
fun deleteHead(): Int {
if(stackOutput.empty()){
while(!stackInput.empty()){
stackOutput.push(stackInput.pop())
}
}
if(stackOutput.empty())
return -1
return stackOutput.pop()
}
}