代碼隨想錄算法訓(xùn)練營Day 10 | LeetCode232用棧實(shí)現(xiàn)隊(duì)列星压、LeetCode225用隊(duì)列實(shí)現(xiàn)棧

摘要

  • 用棧實(shí)現(xiàn)隊(duì)列践剂,用隊(duì)列實(shí)現(xiàn)棧,雖然可能沒有什么實(shí)際應(yīng)用價(jià)值娜膘,但是對于熟悉棧和隊(duì)列的結(jié)構(gòu)以及基本操作是很有意義的逊脯。
    • 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
    • 通過讓隊(duì)列循環(huán)來實(shí)現(xiàn)棧

今日學(xué)習(xí)的視頻和文章

  • 代碼隨想錄 棧和隊(duì)列的基礎(chǔ)
  • C++Primer 棧和隊(duì)列部分
  • 數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)C++語言版(第二版)棧和隊(duì)列部分

LeetCode232 用隊(duì)列實(shí)現(xiàn)棧

232. 用棧實(shí)現(xiàn)隊(duì)列 - 力扣(Leetcode)

  • 今天的題目比較簡單,棧是后進(jìn)先出竣贪,而隊(duì)列是先進(jìn)先出军洼,用棧實(shí)現(xiàn)隊(duì)列的關(guān)鍵就在于如何將后進(jìn)先出轉(zhuǎn)化為先進(jìn)先出。
    • 如果我們只用一個(gè)棧演怎,能不能做到先進(jìn)先出呢匕争?由于題目要求只能使用棧的標(biāo)準(zhǔn)操作,而彈出先進(jìn)的元素(即棧底的元素)前必須彈出在其之后的所有元素爷耀,所以我們應(yīng)該用另一塊內(nèi)存空間來保留這部分元素汗捡。而這部分元素的彈出順序是遵循棧的后進(jìn)先出的,由對稱性的想法畏纲,這另一個(gè)用來保存元素的空間也可以是棧的結(jié)構(gòu)扇住。
    • 例如,這里元素1盗胀,2艘蹋,3入棧,【或】表示棧底
      • 棧in:【1票灰,2女阀,3 ;棧out:【
      • 此時(shí)屑迂,根據(jù)隊(duì)列的先進(jìn)先出浸策,我們要彈出1,將2惹盼,3保留在另一個(gè)棧中
      • 棧in:【1庸汗;棧out:【3,2手报,
      • 為了代碼邏輯更加簡潔蚯舱,我們可以統(tǒng)一將棧1的元素都push進(jìn)棧2中改化,而不是判斷棧1是否還剩余1個(gè)元素
      • 棧in:【;棧out:【3枉昏,2陈肛,1
      • 此時(shí)在讓棧2的棧頂元素出棧即可
      • 棧in:【;棧out:【3兄裂,2
    • 再插入元素到用棧實(shí)現(xiàn)的隊(duì)列中的邏輯與元素出隊(duì)列的邏輯是對稱的句旱,銜接上面的例子,我們要插入元素4晰奖,元素4是后進(jìn)的前翎,所以對于出棧來說它應(yīng)該位于棧底:棧out【4,3畅涂,2
      • 棧in:【港华;棧out:【3,2
      • 此時(shí)午衰,將棧out的元素push回棧in中
      • 棧in:【2立宜,3;棧out:【
      • 然后再將元素4 push進(jìn)棧in中
      • 棧in:【2臊岸,3橙数,4;棧out:【
      • 這樣就完成了元素4進(jìn)入用棧實(shí)現(xiàn)的隊(duì)列的操作

完整題解代碼如下

class MyQueue {
private:
    stack<int> in;
    stack<int> out;
public:
    MyQueue() {

    }
    
    void push(int x) {
        while (!out.empty()) {
            in.push(out.top());
            out.pop();
        }
        in.push(x);
    }
    
    int pop() {
        while (!in.empty()) {
            out.push(in.top());
            in.pop();
        }
        int temp = out.top();
        out.pop();// 要注意這里的 pop 會返回值帅戒,而C++STL的棧的pop是不返回值的
        return temp;
    }
    
    int peek() {
        while (!in.empty()) {
            out.push(in.top());
            in.pop();
        }
        return out.top();
    }
    
    bool empty() {
        return in.empty() && out.empty();
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

LeetCode225 用隊(duì)列實(shí)現(xiàn)棧

  • 初見題目時(shí)的想法:既然用兩個(gè)棧能實(shí)現(xiàn)隊(duì)列灯帮,那對稱地來想,是不是能用兩個(gè)隊(duì)列來實(shí)現(xiàn)棧呢逻住?
  • 這里用【表示隊(duì)列頭钟哥,用】表示隊(duì)列尾
    • 假設(shè)元素1,2瞎访,3進(jìn)入由隊(duì)列實(shí)現(xiàn)的棧腻贰,那么根據(jù)后進(jìn)先出,此時(shí)應(yīng)該彈出的是元素3
    • 隊(duì)列1:【1扒秸,2播演,3】;隊(duì)列2:【】
    • 如果我們簡單去類比用兩個(gè)棧實(shí)現(xiàn)隊(duì)列伴奥,想用兩個(gè)隊(duì)列實(shí)現(xiàn)棧的話
    • 隊(duì)列1:【】写烤;隊(duì)列2:【1,2拾徙,3】
    • 上面的隊(duì)列2再pop洲炊,還是彈出元素1而不是元素3。
    • 因?yàn)殛?duì)列是先進(jìn)先出,即使我們模仿棧實(shí)現(xiàn)隊(duì)列的思路选浑,把要彈出的元素之前的元素保留在另一個(gè)隊(duì)列中,也無法實(shí)現(xiàn)棧玄叠。因?yàn)樵跅5暮筮M(jìn)先出古徒,我們可以通過兩個(gè)棧顛倒元素的彈出順序;但是隊(duì)列的彈出順序就是我們將元素放入隊(duì)列的順序读恃。
  • 然后隧膘,我注意到,兩個(gè)棧實(shí)現(xiàn)隊(duì)列中寺惫,有一個(gè)地方被簡化了邏輯:
    • ”為了代碼邏輯更加簡潔疹吃,我們可以統(tǒng)一將棧1的元素都push進(jìn)棧2中,而不是判斷棧1是否還剩余1個(gè)元素“
    • 實(shí)際上西雀,我們只需要判斷隊(duì)列是否出隊(duì)到只剩隊(duì)尾元素(即最后一個(gè)進(jìn)入隊(duì)列的元素)萨驶,然后在按順序保存隊(duì)列的其他元素時(shí)讓隊(duì)尾元素出隊(duì)即可。
    • 這樣一來艇肴,實(shí)際上我們可以只用一個(gè)隊(duì)列來實(shí)現(xiàn)棧腔呜,即讓隊(duì)首元素出隊(duì)后再入隊(duì),直到我們遍歷到原來的隊(duì)尾元素再悼,讓其出隊(duì)而不再入隊(duì)即可核畴。
      • 例子:【1,2冲九,3】-> 【2谤草,3,1】-> 【3莺奸,1丑孩,2】-> 【1,2】
    • 那么如何push元素到由隊(duì)列實(shí)現(xiàn)的棧中呢灭贷?我們在上面實(shí)現(xiàn)的出棧操作中嚎杨,是固定彈出隊(duì)尾元素的,所以我們直接將元素push到隊(duì)列中就好了氧腰。

完整的題解代碼如下

class MyStack {
private:
    queue<int> q;
public:
    MyStack() {

    }
    
    void push(int x) {
        q.push(x);
    }
    
    int pop() {
        int count = 0;
        while (count < q.size() - 1) {
            q.push(q.front());
            q.pop();
            count++;
        }
        int temp = q.front();
        q.pop();
        return temp;
    }
    
    int top() {
        int temp = pop();
        push(temp);
        return temp;
    }
    
    bool empty() {
        return q.empty();
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枫浙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子古拴,更是在濱河造成了極大的恐慌箩帚,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黄痪,死亡現(xiàn)場離奇詭異紧帕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門是嗜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愈案,“玉大人,你說我怎么就攤上這事鹅搪≌拘鳎” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵丽柿,是天一觀的道長恢准。 經(jīng)常有香客問我,道長甫题,這世上最難降的妖魔是什么馁筐? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮坠非,結(jié)果婚禮上敏沉,老公的妹妹穿的比我還像新娘。我一直安慰自己炎码,他們只是感情好赦抖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辅肾,像睡著了一般队萤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矫钓,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天要尔,我揣著相機(jī)與錄音,去河邊找鬼新娜。 笑死赵辕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的概龄。 我是一名探鬼主播还惠,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼私杜!你這毒婦竟也來了蚕键?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衰粹,失蹤者是張志新(化名)和其女友劉穎锣光,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铝耻,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡誊爹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片频丘。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡办成,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搂漠,到底是詐尸還是另有隱情迂卢,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布状答,位于F島的核電站冷守,受9級特大地震影響刀崖,放射性物質(zhì)發(fā)生泄漏惊科。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一亮钦、第九天 我趴在偏房一處隱蔽的房頂上張望馆截。 院中可真熱鬧,春花似錦蜂莉、人聲如沸蜡娶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窖张。三九已至,卻和暖如春蚁滋,著一層夾襖步出監(jiān)牢的瞬間宿接,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工辕录, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睦霎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓走诞,卻偏偏與公主長得像副女,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蚣旱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容