2018年11月30日 星期五

堆疊(Stack)& 佇列(Queue)

在解釋基本程式概念時,很難知道從哪裡開始。當有人開始編碼時,有大量不同的想法需要理解,吸收並最終轉化為解決方案。這取決於您所選語言的語法和特性。

最好的方法之一就是通過練習題來開始編寫程式碼。好像購物清單的使用,無論度假還是超市購物。程式碼中的列表邏輯就像在現實生活中清單一樣。清單很容易處理瑣事和片段的記憶。例如,在Python中,您可以如此建立一個購物清單(陣列)

shoppinglist = ["rice","salt","oil"]
print(shoppinglist)
['rice', 'salt', 'oil']

push() pop()
3.oil
2.salt
1.rice

這是一個陣列,因為每個值本身就是一個字串。但是陣列是動態的,您經常要做的第一件事就是新增資料,如何增加新資料是一個學問。例如,CPU如何增加法運算速度更快,或是以最好的方式將資料放在記憶體內,是從後面加好呢,還是從前面加。

堆疊
網路上大部分的人都是用疊書來做比喻,疊最高的也就是最後一本必須先拿,成為後進先出LIFO(Last In First Out)或者先進後出FILO(First In Last Out)的例子。我們也可以把它想做是Linux command列的歷史紀錄查詢一樣我們會先查最後一筆然後一直往上查,或是查看瀏覽器之前看過的頁面可以用上一頁網上查做作為後進先出的例子。

Python中可用append增加一筆資料
shoppinglist.append("tea")
print(len(shoppinglist))
4

push() pop()
4.tea
3.oil
2.salt
1.rice

Python中可用pop()取出一筆資料
shoppinglist.pop()  
print(shoppinglist)
['rice', 'salt', 'oil']

a stack
push() pop()
4.tea
3.oil
2.salt
1.rice

push()
將資料放入堆疊頂端
pop()
取出堆疊頂端之資料

心得
從最後一筆取得資料的時候處理器可以處理的較快。另外,索引也不用重建。

應用..........
CPU中斷處理
遞迴程式
十進位轉二進位
套環遊戲
字串反轉

佇列
a queue
先進先出法FIFO(First In First Out)
雖然新增或移除資料時,同步修改索引位址,浪費資源。但今日處理器的速度已經不在乎是先進先出或後進先出

shoppinglist.pop(0)     
'rice'
從第1筆取出
print(shoppinglist)     
['salt', 'oil']

pop() 1.rice 2.salt 3.oil push()

for x in range(0,len(shoppinglist)):
...  shoppinglist[x]
...  print
... 
'salt'
'oil'

陣列的建立會有一個索引來記錄目前所指到的位址,新增或移除資料時,同步修改索引位址

應用..........
大多數的程式運用