每日算法:用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
本文轉(zhuǎn)載自微信公眾號(hào)「三分鐘學(xué)前端」,作者 sisterAn 。轉(zhuǎn)載本文請(qǐng)聯(lián)系三分鐘學(xué)前端公眾號(hào)。
用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列。隊(duì)列的聲明如下,請(qǐng)實(shí)現(xiàn)它的兩個(gè)函數(shù) appendTail 和 deleteHead ,分別完成在隊(duì)列尾部插入整數(shù)和在隊(duì)列頭部刪除整數(shù)的功能。(若隊(duì)列中沒(méi)有元素,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
- 最多會(huì)對(duì) appendTail 、deleteHead 進(jìn)行 10000 次調(diào)用
解題思路:
- 棧后進(jìn)先出,隊(duì)列先進(jìn)先出
- 雙??梢詫?shí)現(xiàn)序列倒置:假設(shè)有 stack1=[1, 2, 3] 、 stack2=[] ,如果循環(huán)出棧 stack1 并將出棧元素進(jìn)棧 stack2 ,則循環(huán)結(jié)束后, stack1=[] 、 stack2=[3, 2, 1] ,即通過(guò) stack2 實(shí)現(xiàn)了 stack1 中元素的倒置
- 當(dāng)需要?jiǎng)h除隊(duì)首元素時(shí),僅僅需要 stack2 出棧即可;當(dāng) stack2 為空時(shí),出隊(duì)就需要將 stack1 元素倒置倒 stack2 , stack2 再出隊(duì)即可;如果 stack1 也為空,即隊(duì)列中沒(méi)有元素,返回 -1
代碼實(shí)現(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()
- };
復(fù)雜度分析:
時(shí)間復(fù)雜度:appendTail 的時(shí)間復(fù)雜度為O(1),deleteHead 的時(shí)間復(fù)雜度為 O(n)
空間復(fù)雜度:O(n)