1. 程式人生 > >棧和隊列(2)

棧和隊列(2)

實現 放置 怎麽 事情 棧操作 ron bsp 使用 alt

一、題目:僅用遞歸函數和棧操作逆序一個棧

將一個棧裏面的元素逆序,只能用遞歸函數來實現,不能用其他數據結構。

  1. 只能用遞歸函數來實現
  2. 可以使用現成的棧類型

思路:

為了將棧逆序,只需要按順序將棧頂至棧底的元素拿出並移除,放置到棧頂中,這樣就可以將棧逆序。

兩個遞歸函數

一個將棧底元素取出。

一個將剩下的棧元素逆序。

如:

輸入棧{1, 2, 3, 4, 5},1在棧頂。顛倒之後的棧為{5, 4, 3, 2, 1},5處在棧頂。

// 我們再來考慮怎麽遞歸。我們把棧{1, 2, 3, 4, 5}看成由兩部分組成:棧頂元素1和剩下的部分{2, 3, 4, 5}。如果我們能把{2, 3, 4, 5}顛倒過來,變成{5, 4, 3, 2},然後在把原來的棧頂元素1放到底部,那麽就整個棧就顛倒過來了,變成 {5, 4, 3, 2, 1}。

// 接下來我們需要考慮兩件事情:一是如何把{2, 3, 4, 5}顛倒過來變成{5, 4, 3, 2}。我們只要把{2, 3, 4, 5}看成由兩部分組成:棧頂元素2和剩下的部分{3, 4, 5}。

// 我們只要把{3, 4, 5}先顛倒過來變成{5, 4, 3},然後再把之前的棧頂元素2放到最底部,也就變成了{5, 4, 3, 2}。
// 至於怎麽把{3, 4, 5}顛倒過來……這就是遞歸。也就是每一次試圖顛倒一個棧的時候,現在棧頂元素pop出來,
// 再顛倒剩下的元素組成的棧,最後把之前的棧頂元素放到剩下元素組成的棧的底部。遞歸結束的條件是剩下的棧已經空了

代碼:

import queue
stack 
= queue.LifoQueue() for i in range(1,6): stack.put(i) #第一個取出棧底元素的遞歸函數 def getLast(stack): if stack.empty(): return result = stack.get() if stack.empty(): return result else: last = getLast(stack) stack.put(result) return last #第二個遞歸,逆序 def
reverse(stack): if stack.empty(): return last = getLast(stack) reverse(stack) stack.put(last) # print(stack.empty) reverse(stack)


二、題目:用一個棧實現另一個棧的排序

一個棧中元素的類型為整型,若將棧從頂到底按從大到小的順序排序,只許申請一個棧。可以申請新的變量,但不能申請額外的數據結構。

思路:

技術分享圖片

代碼:

def getFirst(stack):
    first = stack.get()
    stack.put(first)
    return first

def sortstack(stack):
    if stack.empty():
        return 
    helper = queue.LifoQueue()
    while not stack.empty():
        cur = stack.get()    
        
        while not helper.empty() and getFirst(helper) < cur:
            stack.put(helper.get())
        helper.put(cur)
    while not helper.empty():
        stack.put(helper.get())
    return stack


棧和隊列(2)