python 兩個棧實(shí)現(xiàn)一個隊(duì)列 && 兩個隊(duì)列實(shí)現(xiàn)一個棧

劍指Offer09.用兩個棧實(shí)現(xiàn)隊(duì)列

https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/jian-zhi-offer09yong-liang-ge-zhan-shi-x-hybm/

難度:簡單

題目:

用兩個棧實(shí)現(xiàn)一個隊(duì)列。隊(duì)列的聲明如下唆阿,請實(shí)現(xiàn)它的兩個函數(shù) appendTail 和 deleteHead 丹弱,

分別完成在隊(duì)列尾部插入整數(shù)和在隊(duì)列頭部刪除整數(shù)的功能勤揩。(若隊(duì)列中沒有元素驹针,deleteHead操作返回 -1 )

提示:

  • 1 <= values <= 10000
  • 最多會對 appendTail逞刷、deleteHead 進(jìn)行 10000 次調(diào)用

示例:

示例 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]

分析

首先掃盲隊(duì)列與棧的知識:

  • 隊(duì)列:先進(jìn)先出
  • 棧:后進(jìn)先出

那么纠俭,為什么要雙棧實(shí)現(xiàn)隊(duì)列呢冰木?其實(shí)大家只要思考下:
我們準(zhǔn)備兩個棧add_stack和pop_stack:

  1. 先把1,2,3先挨個加入add_stack棧
  2. 下來依次將add_stack棧內(nèi)的數(shù)據(jù)出棧穷劈,同時將出棧的數(shù)據(jù)加入pop_stack棧中
  3. 1、2執(zhí)行完成后踊沸,add_stack變成了空歇终,pop_stack棧中存儲的數(shù)據(jù)成了[3,2,1]
  4. 那么下次出棧時,直接將pop_stack的棧內(nèi)數(shù)據(jù)彈出逼龟,不就成了列隊(duì)的先進(jìn)先出评凝!

關(guān)于什么時候執(zhí)行2步驟需要注意下:

  1. 如果pop_stack棧中有數(shù)據(jù),就直接return pop的數(shù)據(jù)
  2. 如果pop_stack棧中沒有數(shù)據(jù)
    a. add_stack也沒有數(shù)據(jù)腺律,return -1
    b. add_stack有數(shù)據(jù)奕短,執(zhí)行上面步驟2,將add_stack數(shù)據(jù)加入pop_stack中
  3. 返回pop_stack棧彈出的數(shù)據(jù)

解題:

class CQueue:
    def __init__(self):
        self.add_stack, self.pop_stack = [], []

    def appendTail(self, value: int) -> None:
        self.add_stack.append(value)

    def deleteHead(self) -> int:
        if self.pop_stack:
            return self.pop_stack.pop()
        if not self.add_stack:
            return -1
        while self.add_stack:
            self.pop_stack.append(self.add_stack.pop())
        return self.pop_stack.pop()

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

https://leetcode-cn.com/problems/implement-stack-using-queues/solution/225yong-dui-lie-shi-xian-zhan-by-qingfen-igp1/

難度:簡單

題目:

請你僅使用兩個隊(duì)列實(shí)現(xiàn)一個后入先出(LIFO)的棧匀钧,并支持普通隊(duì)列的全部四種操作(push翎碑、top、pop 和 empty)之斯。

實(shí)現(xiàn) MyStack 類:

void push(int x) 將元素 x 壓入棧頂日杈。
int pop() 移除并返回棧頂元素。
int top() 返回棧頂元素佑刷。
boolean empty() 如果棧是空的莉擒,返回 true ;否則瘫絮,返回 false 涨冀。

注意:

  • 你只能使用隊(duì)列的基本操作 —— 也就是push to back、peek/pop from front麦萤、size 和is empty這些操作蝇裤。
  • 你所使用的語言也許不支持隊(duì)列。你可以使用 list (列表)或者 deque(雙端隊(duì)列)來模擬一個隊(duì)列, 只要是標(biāo)準(zhǔn)的隊(duì)列操作即可频鉴。

示例:

輸入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
輸出:
[null, null, null, 2, 2, false]

解釋:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

分析

這道題的關(guān)鍵在于每次入隊(duì)時,如何保證入隊(duì)后新入隊(duì)的元素排在隊(duì)首恋拍,題目要求使用兩個隊(duì)列實(shí)現(xiàn)垛孔。

  1. 首先我們創(chuàng)建兩個隊(duì)列,python操作為from collections import deque
  2. 元素入隊(duì)時施敢,將元素加入q1
  3. 判斷q2是否存在元素周荐,如果存在元素狭莱,則將元素依次出隊(duì)并加入q1的隊(duì)尾
  4. 交換q1與q2
    至于出隊(duì)、查詢top概作、是否為空腋妙,都在q2上操作即可

解題:

from collections import deque


class MyStack:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.q1 = deque()
        self.q2 = deque()

    def push(self, x: int) -> None:
        """
        Push element x onto stack.
        """
        self.q1.append(x)
        while self.q2:
            self.q1.append(self.q2.popleft())
        self.q1, self.q2 = self.q2, self.q1

    def pop(self) -> int:
        """
        Removes the element on top of the stack and returns that element.
        """
        return self.q2.popleft()

    def top(self) -> int:
        """
        Get the top element.
        """
        return self.q2[0]

    def empty(self) -> bool:
        """
        Returns whether the stack is empty.
        """
        return not self.q2

歡迎關(guān)注我的公眾號: 清風(fēng)Python,帶你每日學(xué)習(xí)Python算法刷題的同時讯榕,了解更多python小知識骤素。

我的個人博客:https://qingfengpython.cn

力扣解題合集:https://github.com/BreezePython/AlgorithmMarkdown

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市愚屁,隨后出現(xiàn)的幾起案子济竹,更是在濱河造成了極大的恐慌,老刑警劉巖霎槐,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件送浊,死亡現(xiàn)場離奇詭異,居然都是意外死亡丘跌,警方通過查閱死者的電腦和手機(jī)袭景,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闭树,“玉大人耸棒,你說我怎么就攤上這事“玻” “怎么了榆纽?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捏肢。 經(jīng)常有香客問我奈籽,道長,這世上最難降的妖魔是什么鸵赫? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任衣屏,我火速辦了婚禮,結(jié)果婚禮上辩棒,老公的妹妹穿的比我還像新娘狼忱。我一直安慰自己,他們只是感情好一睁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布钻弄。 她就那樣靜靜地躺著,像睡著了一般者吁。 火紅的嫁衣襯著肌膚如雪窘俺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天复凳,我揣著相機(jī)與錄音瘤泪,去河邊找鬼灶泵。 笑死,一個胖子當(dāng)著我的面吹牛对途,可吹牛的內(nèi)容都是我干的赦邻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼实檀,長吁一口氣:“原來是場噩夢啊……” “哼惶洲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起劲妙,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤湃鹊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后镣奋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體币呵,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年侨颈,在試婚紗的時候發(fā)現(xiàn)自己被綠了余赢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡哈垢,死狀恐怖妻柒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耘分,我是刑警寧澤举塔,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站求泰,受9級特大地震影響禽笑,放射性物質(zhì)發(fā)生泄漏王凑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蠢络。 院中可真熱鬧袱箱,春花似錦熬的、人聲如沸点寥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚊俺。三九已至,卻和暖如春逛万,著一層夾襖步出監(jiān)牢的瞬間泳猬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暂殖,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓当纱,卻偏偏與公主長得像呛每,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坡氯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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