用兩個棧實現(xiàn)一個隊列。隊列的聲明如下,請實現(xiàn)它的兩個函數(shù) appendTail 和 deleteHead ,分別完成在隊列尾部插入整數(shù)和在隊列頭部刪除整數(shù)的功能。(若隊列中沒有元素,deleteHead 操作返回 -1 )
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
題目如上,出處leetcode官網(wǎng)
由于我是Android開發(fā)的原因,最開始采用的是kotlin語言編寫
class CQueue() {
//新建一個輸入棧
val s = Stack<Int>()
//一個輸出棧
val s2 = Stack<Int>()
fun appendTail(value: Int) {
if (s.empty()) {
while (!s2.empty()) {
s.add(s2.pop())
}
}
s.add(value)
}
fun deleteHead(): Int {
//如果輸出棧沒有內(nèi)容,則將輸入棧反轉(zhuǎn)并壓入輸出棧,然后pop即可達到隊頭刪除的要求
if (s2.empty()) {
while (!s.empty()) {
s2.add(s.pop())
}
}
if (s2.empty()){
return -1
}
return s2.pop()
}
}
無疑這個寫法他沒毛病,但是當(dāng)我查看官方解體之后發(fā)現(xiàn)3處可優(yōu)化的地方
1、在appendTail函數(shù)執(zhí)行時可以直接添加,不需要將s2中的數(shù)據(jù)反轉(zhuǎn)回來。原因我想只需要稍微思考一下就能明白,這里不贅述.
2、應(yīng)該使用push進行添加,因為棧的定義是后進先出,add有歧義,無關(guān)性能,單純的覺得用push更好
3、應(yīng)該使用ArrayDeque代替Stack
為什么要用ArrayDeque代替Stack?
一句話,stack性能低,stack繼承自Vector,vector對函數(shù)加了鎖;
關(guān)于ArrayDeque和Stack的更多知識請參閱 https://blog.csdn.net/deng_hui_long/article/details/120639629。
最后,推薦使用java解答(我只會java和kotlin),根據(jù)leetcode的提交記錄顯示,java的運輸速度和內(nèi)存消耗都遠遠小于kotlin

最終的代碼
class CQueue {
public CQueue() {
}
private Deque<Integer> inQ = new ArrayDeque<Integer>();
private Deque<Integer> outQ = new ArrayDeque<Integer>();
public void appendTail(int value) {
inQ.push(value);
}
public int deleteHead() {
if (outQ.isEmpty()) {
if (inQ.isEmpty()) {
return -1;
}
while (!inQ.isEmpty()) {
outQ.push(inQ.pop());
}
}
return outQ.pop();
}
}