每日算法:用兩個棧實現(xiàn)隊列
作者: sisterAn
用兩個棧實現(xiàn)一個隊列。隊列的聲明如下,請實現(xiàn)它的兩個函數(shù) appendTail 和 deleteHead ,分別完成在隊列尾部插入整數(shù)和在隊列頭部刪除整數(shù)的功能。
本文轉載自微信公眾號「三分鐘學前端」,作者 sisterAn 。轉載本文請聯(lián)系三分鐘學前端公眾號。
用兩個棧實現(xiàn)一個隊列。隊列的聲明如下,請實現(xiàn)它的兩個函數(shù) appendTail 和 deleteHead ,分別完成在隊列尾部插入整數(shù)和在隊列頭部刪除整數(shù)的功能。(若隊列中沒有元素,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 次調用
解題思路:
- 棧后進先出,隊列先進先出
- 雙??梢詫崿F(xiàn)序列倒置:假設有 stack1=[1, 2, 3] 、 stack2=[] ,如果循環(huán)出棧 stack1 并將出棧元素進棧 stack2 ,則循環(huán)結束后, stack1=[] 、 stack2=[3, 2, 1] ,即通過 stack2 實現(xiàn)了 stack1 中元素的倒置
- 當需要刪除隊首元素時,僅僅需要 stack2 出棧即可;當 stack2 為空時,出隊就需要將 stack1 元素倒置倒 stack2 , stack2 再出隊即可;如果 stack1 也為空,即隊列中沒有元素,返回 -1
代碼實現(xiàn):
- const CQueue = function() {
- this.stack1 = []
- this.stack2 = []
- };
- CQueue.prototype.appendTail = function(value) {
- this.stack1.push(value)
- };
- CQueue.prototype.deleteHead = function() {
- if(this.stack2.length) {
- return this.stack2.pop()
- }
- if(!this.stack1.length) return -1
- while(this.stack1.length) {
- this.stack2.push(this.stack1.pop())
- }
- return this.stack2.pop()
- };
復雜度分析:
時間復雜度:appendTail 的時間復雜度為O(1),deleteHead 的時間復雜度為 O(n)
空間復雜度:O(n)
責任編輯:武曉燕
來源:
三分鐘學前端