Datawhale第九期組隊學習--數據結構與算法(上)Task03:棧與遞歸(2天)

理論部分
  • 用數組實現一個順序棧。
  • 用鏈表實現一個鏈棧。
  • 理解遞歸的原理。

棧:

  1. 定義
    棧是隻能通過訪問它的一端來實現數據存儲和檢索的一種線性數據結構。棧又稱爲後進先出(Last In First Out,LIFO)的線性表。
    在棧中進行插入和刪除操作的一端稱爲棧頂(Top),相應地,另一端稱爲棧底(Bottom)。不含數據元素的棧稱爲空棧。

  2. 存儲結構

  • 順序結構。採用順序存儲結構的棧稱爲順序棧。棧空間的容量是有限的,需要預先定義(或申請)棧的存儲空間。因此,在順序棧中,當一個元素入棧時,需要判斷是否滿棧(棧空間中有沒有空閒單元),若棧滿,則元素不能入棧。
  1. 應用
    棧的典型應用包括表達式求值、括號匹配等,在計算機語言的實現以及將遞歸過程轉變爲非遞歸過程的處理中,棧又非常重要的作用。
    怎麼理解棧的應用?有哪些實例?
練習部分
  1. 根據要求完成車輛重排的程序代碼

假設一列貨運列車共有n節車廂,每節車廂將停放在不同的車站。假定n個車站的編號分別爲1至n,貨運列車按照第n站至第1站的次序經過這些車站。車廂的編號與它們的目的地相同。爲了便於從列車上卸掉相應的車廂,必須重新排列車廂,使各車廂從前至後按編號1至n的次序排列。當所有的車廂都按照這種次序排列時,在每個車站只需卸掉最後一節車廂即可。

我們在一個轉軌站裏完成車廂的重排工作,在轉軌站中有一個入軌、一個出軌和k個緩衝鐵軌(位於入軌和出軌之間)。圖(a)給出一個轉軌站,其中有k個(k=3)緩衝鐵軌H1,H2 和H3。開始時,n節車廂的貨車從入軌處進入轉軌站,轉軌結束時各車廂從右到左按照編號1至n的次序離開轉軌站(通過出軌處)。在圖(a)中,n=9,車廂從後至前的初始次序爲5,8,1,7,4,2,9,6,3。圖(b)給出了按所要求的次序重新排列後的結果。

具有三個緩衝區鐵軌的轉軌站

編寫算法實現火車車廂的重排,模擬具有n節車廂的火車“入軌”和“出軌”過程。車輛重排
實思路過程如圖:車輛重排棧圖示
代碼問題:
1、如果緩衝鐵軌不夠的話,應該在哪提示?
2、結果打印最後多一個None,不知道哪裏的?

# cars: 等待排序的車廂 k: 緩衝軌數量,
def railroad(cars, k):
    cacheLists = []
    for i in range(k):
        cacheLists.append([])
    init = 1
    for i in cars:
        if i == init:
            print('{}號車廂入軌->出軌'.format(i))
            init += 1
            continue
        else:
            for list_item in cacheLists:
                if not list_item:
                    list_item.append(i)
                    break
                else:
                    if min(list_item) > i:
                        list_item.append(i)
                        break

    for item in cacheLists:
        for i in range(len(item)):
            last = item.pop()
            if last == init:
                print('{}號車廂入軌->出軌'.format(last))
                init += 1


car = [5, 8, 1, 7, 4, 2, 9, 6, 3]
n = 3
print(railroad(car, n))

打印結果:

1號車廂入軌->出軌
2號車廂入軌->出軌
3號車廂入軌->出軌
4號車廂入軌->出軌
5號車廂入軌->出軌
6號車廂入軌->出軌
7號車廂入軌->出軌
8號車廂入軌->出軌
9號車廂入軌->出軌
None
發佈了11 篇原創文章 · 獲贊 0 · 訪問量 1525
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章