leetcode 232 棧實(shí)現(xiàn)隊(duì)列

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

使用棧實(shí)現(xiàn)隊(duì)列的下列操作:

  • push(x) -- 將一個(gè)元素放入隊(duì)列的尾部址儒。
  • pop() -- 從隊(duì)列首部移除元素术奖。
  • peek() -- 返回隊(duì)列首部的元素嗤军。
  • empty() -- 返回隊(duì)列是否為空。

示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false

說(shuō)明:

  • 你只能使用標(biāo)準(zhǔn)的棧操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的羊异。
  • 你所使用的語(yǔ)言也許不支持棧砖顷。你可以使用 list 或者 deque(雙端隊(duì)列)來(lái)模擬一個(gè)棧喷众,只要是標(biāo)準(zhǔn)的棧操作即可浓恶。
  • 假設(shè)所有操作都是有效的 (例如奋救,一個(gè)空的隊(duì)列不會(huì)調(diào)用 pop 或者 peek 操作)岭参。

解題思路

  • 在Golang中,本身未提供棧數(shù)據(jù)結(jié)構(gòu),先基于數(shù)組實(shí)現(xiàn)棧結(jié)構(gòu)
  • 優(yōu)化: 入隊(duì)時(shí),將元素壓入s1,出隊(duì)時(shí),判斷s2是否為空尝艘,如不為空演侯,則直接彈出頂元素;如為空背亥,則將s1的元素逐個(gè)“倒入”s2秒际,把最后一個(gè)元素彈出并出隊(duì)
  • 避免反復(fù)"倒"棧,僅在需要時(shí)才"倒"一次
  • 細(xì)節(jié): 考慮沒(méi)有元素可供出隊(duì)時(shí)的處理(2個(gè)棧都為空的時(shí)候悬赏,出隊(duì)操作一定會(huì)引起異常)

代碼實(shí)現(xiàn)

/**
 * Your MyQueue object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Push(x);
 * param_2 := obj.Pop();
 * param_3 := obj.Peek();
 * param_4 := obj.Empty();
 */

// MyQueue defines Stack1 queue by two stacks
type MyQueue struct {
    Stack1, Stack2 *stack
}

// Constructor Initialize your data structure here.
func Constructor() MyQueue {
    return MyQueue{
        Stack1: newStack(),
        Stack2: newStack(),
    }
}

// Push element x to the back of queue.
func (queue *MyQueue) Push(x int) {
    queue.Stack1.push(x)
}

// Pop Removes the element from in front of queue and returns that element.
func (queue *MyQueue) Pop() int {
    if queue.Stack2.isEmpty() {
        //優(yōu)化: 棧a中留一個(gè)元素供pop,可以少一次操作
        for queue.Stack1.len() > 1 {
            queue.Stack2.push(queue.Stack1.pop())
        }
        return queue.Stack1.pop()
    }
    return queue.Stack2.pop()
}

// Peek Get the front element.
func (queue *MyQueue) Peek() int {
    if queue.Stack2.isEmpty() {
        if queue.Stack1.isEmpty() {
            return -1
        }
        return queue.Stack1.nums[0]
    }
    return queue.Stack2.nums[queue.Stack2.len()-1]
}

// Empty Returns whether the queue is empty.
func (queue *MyQueue) Empty() bool {
    return queue.Stack1.isEmpty() && queue.Stack2.isEmpty()
}

// stack defines Stack1 stack
type stack struct {
    nums []int
}

// newStack creates a empty stack
func newStack() *stack {
    return &stack{
        nums: []int{},
    }
}

func (s *stack) push(n int) {
    s.nums = append(s.nums, n)
}

func (s *stack) pop() int {
    if s.isEmpty() {
        return -1
    }
    res := s.nums[len(s.nums)-1]
    s.nums = s.nums[:len(s.nums)-1]
    return res
}

func (s *stack) len() int {
    return len(s.nums)
}
func (s *stack) isEmpty() bool {
    return s.len() == 0
}

GitHub

  • 源碼在這里
  • 項(xiàng)目中會(huì)提供各種數(shù)據(jù)結(jié)構(gòu)及算法的Golang實(shí)現(xiàn),以及 LeetCode 解法
參考資料

用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列——我作為面試官的小結(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市娄徊,隨后出現(xiàn)的幾起案子闽颇,更是在濱河造成了極大的恐慌,老刑警劉巖寄锐,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兵多,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡橄仆,警方通過(guò)查閱死者的電腦和手機(jī)剩膘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盆顾,“玉大人援雇,你說(shuō)我怎么就攤上這事∽笛铮” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵具温,是天一觀的道長(zhǎng)蚕涤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)铣猩,這世上最難降的妖魔是什么揖铜? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮达皿,結(jié)果婚禮上天吓,老公的妹妹穿的比我還像新娘。我一直安慰自己峦椰,他們只是感情好龄寞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汤功,像睡著了一般物邑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滔金,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天色解,我揣著相機(jī)與錄音,去河邊找鬼餐茵。 笑死科阎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忿族。 我是一名探鬼主播锣笨,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蝌矛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了票唆?” 一聲冷哼從身側(cè)響起朴读,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎走趋,沒(méi)想到半個(gè)月后衅金,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡簿煌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年氮唯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姨伟。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惩琉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夺荒,到底是詐尸還是另有隱情瞒渠,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布技扼,位于F島的核電站伍玖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏剿吻。R本人自食惡果不足惜窍箍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丽旅。 院中可真熱鬧椰棘,春花似錦、人聲如沸榄笙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茅撞。三九已至外恕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乡翅,已是汗流浹背鳞疲。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蠕蚜,地道東北人尚洽。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像靶累,于是被迫代替她去往敵國(guó)和親腺毫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子癣疟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 題目描述 使用棧實(shí)現(xiàn)隊(duì)列的下列操作: push(x) -- 將一個(gè)元素放入隊(duì)列的尾部。 pop() -- 從隊(duì)列首...
    云胡同學(xué)閱讀 381評(píng)論 0 0
  • 棧 棧的英文單詞是Stack,它代表一種特殊的線性表潮酒,這種線性表只能在固定一端(通常認(rèn)為是線性表的尾端)進(jìn)行插入睛挚,...
    Jack921閱讀 1,504評(píng)論 0 5
  • 一扎狱、棧 1.1 棧的實(shí)現(xiàn) 棧(Stack)是限制僅在表的一端進(jìn)行插入和刪除運(yùn)算的線性表。java沒(méi)有棧這樣的數(shù)據(jù)結(jié)...
    yjaal閱讀 1,458評(píng)論 0 1
  • Input—Problem Solving--Output 1. 這是一個(gè)信息大爆炸的時(shí)代勃教,我可以躋身的頭部在哪里...
    GRACE_QY閱讀 240評(píng)論 0 1
  • 白鷺立雪淤击,愚人看鷺,聰明見(jiàn)雪故源,智者觀白污抬。 雪地梅花初放 雪里梅花初放,暗香深夜飛來(lái)绳军。 正對(duì)寒燈獨(dú)坐印机,忽將鼻孔沖開。
    暗香Joan閱讀 145評(píng)論 0 0