tft每日頭條

 > 生活

 > 堆棧與隊列的相同點

堆棧與隊列的相同點

生活 更新时间:2024-07-20 20:24:38

金豬腳本(原飛豬腳本)以按鍵精靈教學為主,涉及UiBot,Python,Lua等腳本編程語言,教學包括全自動辦公腳本,遊戲輔助腳本,引流腳本,網頁腳本,安卓腳本,IOS腳本,注冊腳本,點贊腳本,閱讀腳本以及網賺腳本等各個領域。想學習按鍵精靈的朋友可以添加金豬腳本粉絲交流群:554127455 學習路上不再孤單,金豬腳本伴你一同成長.

堆棧與隊列的相同點(堆棧堆)1

上面這個是:什麼是堆棧。我這兒就不再介紹。如果不懂的朋友,可以去看看。

小妖也不是太精,隻能舉例子來給大家說明。說得不好的,多多指點。

按鍵裡面沒有堆棧的概念。因為沒有地址操作(個人理解,大概是那麼回事)。

小妖隻能模仿。利用數組做。

堆:

我這兒說的堆,差不多就是樹了。

樹_百度百科

堆棧與隊列的相同點(堆棧堆)2

堆棧與隊列的相同點(堆棧堆)3

比較懶,直接用網上的圖了,這兒是滿二叉樹。當然,這個樹可以不是二叉樹,也可以不是滿的。

我先做一個三層的二叉樹。讓大家明白樹怎麼做。

  1. Dim 堆
  2. 堆 = array("a", 1, 2) //這兒的1,2是沒有意義的,隻是用來占位而已。如果沒有占位的話,下面的賦值不成功。這兒是根節點。
  3. 堆(1) = array("b", 1, 2)//這兒是左子節點
  4. 堆(2) = array("c", 1, 2)//這兒是右子節點
  5. 堆(1)(1) = array("d")//這兒,因為已經沒有子節點,所以數組隻有這個元素。因為為了便利,我這兒還是用數組。
  6. 堆(1)(2) = array("e")
  7. 堆(2)(1) = array("f")
  8. 堆(2)(2) = array("g")
  9. TracePrint 遍曆樹(堆)
  10. Function 遍曆樹(父節點)
  11. Dim 返回值,i
  12. For i = 0 To UBound(父節點)
  13. If i = 0 Then //如果是0 那麼返回當前節點值
  14. 返回值=父節點(0)
  15. Else //返回子節點值,用了遞歸
  16. 返回值 = 返回值 & 遍曆樹(父節點(i))
  17. End If
  18. Next
  19. 遍曆樹=返回值
  20. End Function

複制代碼

上面,我們定義了一個二叉樹,根節點是a。并且實現遍曆這個二叉樹。

這個樹,可以寫成任意樹。不僅僅是二叉樹。

當然,定義樹的時候,那樣一個一個定義比較費力。建議用數組或者是什麼來定義。

小妖這兒就不詳細說了。有興趣的同學可以回帖讨論。

當然了,後面小妖還會繼續講棧和隊列(實際上上面的代碼已經使用了棧,因為這兒使用了遞歸)。

[backcolor=rgb(247,247,247)]估計大家沒意識到這個堆的用處。我們來舉個例子,比如我們要在一個很大的學校找一個人。那麼如果我們直接一個一個的找,估計找幾天,大的學校估計幾個月。如果我們用堆。

  1. Dim 學校名稱
  2. 學校=array("XX大學",1,2,3,4,5,6,7)
  3. For i = 1 To UBound(學校)
  4. 學校(i) = array(i & "系", 1, 2, 3, 4, 5, 6, 7)
  5. For j = 1 To UBound(學校(i))
  6. 學校(i)(j) = array(i & "班", 1, 2, 3, 4, 5, 6, 7)
  7. For z = 1 To UBound(學校(i)(j))
  8. 學校(i)(j)(z) = (i-1) * 7 * 7 (j-1) * 7 z
  9. Next
  10. Next
  11. Next
  12. //如果我們想查找 XX大學,3系,1班是否有 10号
  13. j="沒有這個人"
  14. For i = 1 To UBound(學校(3)(1))
  15. If 學校(3)(1)(i) = 102 Then
  16. j="有這個人"
  17. Exit for
  18. End If
  19. Next
  20. TracePrint j
  21. //如果我們需要列出 XX大學,4系,2班 所有人員名單
  22. For i = 1 To UBound(學校(3)(1))
  23. TracePrint 學校(3)(1)(i)
  24. Next

複制代碼

甚至說,我們可以知道這個學校有幾個系,每個系有哪些班級,每個班級有哪些人。

小妖這兒僅僅是抛磚引玉。更多的應用,估計其他語言在樹這個運用上已經出神入化。小妖就不再細說。有想法的同學可以跟貼讨論。

棧:

棧就比較常用了。

棧就像一個樓梯,每次增加一個數的時候,你就得往上爬一格。每次減少的時候,你就往下走一格。

54321

像上面這個,從最下面開始裝值,如果增加就往上,如果減少就往下。

例子:

我們做一個從1加到5.

  1. TracePrint 累加(5)
  2. Function 累加(累加值)
  3. If 累加值 = 1 Then
  4. 累加 = 1
  5. Else
  6. 累加=累加值 累加(累加值-1)
  7. End If
  8. End Function

複制代碼

第一次運行的時候,參數累加值為5,累加值不等于1所以運行[backcolor=rgb(247,247,247)]累加=5 累加(5-1)。

所以,這時候最下面的那個棧已經裝入值5了,如下:

[backcolor=rgb(247,247,247)]5 累加(5-1)

這兒其實還沒運行完,因為這兒的累加(5-1)還需要再運行。

所以是運行累加(5-1),其實就是運行:累加(4)。

和上面一樣,隻是參數變成了4。

所以這兒的棧在之前的基礎上,上移一格,進行入棧操作。

[backcolor=rgb(247,247,247)]4 累加(4-1)[backcolor=rgb(247,247,247)]5 累加(5-1)

這樣。一直到瞞住參數=1。

這時候,就開始返回值了。

累加(1)=1[backcolor=rgb(247,247,247)]2 累加(2-1)[backcolor=rgb(247,247,247)]3 累加(3-1)[backcolor=rgb(247,247,247)]4 累加(4-1)[backcolor=rgb(247,247,247)]5 累加(5-1)

這樣滿足條件之後,開始返回值。

[backcolor=rgb(247,247,247)]累加 = 1

這是累加函數返回值,而且這個值是1。

所以,累加(2)=2 累加(1)=2 1=3

累加(3)=3 累加(2)=3 3=6

累加(4)=4 累加(3)=4 6=10

累加(5)=5 累加(4)=5 10=15

這樣就把1加到5的值計算出來了。

如果是1加到100,隻需要把參數改成100就可以了。

如果是5加到100,隻需要判斷參數等于5的時候,就累加=5這樣。

實際上,上面就是遞歸。它使用了棧。所以說,遞歸實際上是耗費了内存的。如果過于龐大的數字,建議不要直接使用遞歸。

最後,我們來說隊列。

其實,隊列和棧是一樣的。隻是,隊列是先進先出。

比如,我們這兒有一個隊列。

  1. Dim 列隊
  2. 列隊 = array(1, 2, 3, 4, 5)
  3. Call 出列()
  4. TracePrint Join(列隊)
  5. Call 入列(10)
  6. TracePrint Join(列隊)
  7. Sub 出列()
  8. 列隊(0)="0|"&列隊(0)&"|"
  9. t = 列隊(0)
  10. 列隊 = Filter(列隊,t ,0)
  11. End sub
  12. Sub 入列(值)
  13. t=UBound(列隊)
  14. Redim Preserve 列隊(t 1)
  15. 列隊(t 1) = 值
  16. End Sub

複制代碼

上面代碼,寫的是一個隊列。出列是第一個出去,入列的是在後面入列。

當然了,你現在還不明白這有什麼用。我們來舉個例子。

  1. dim 環 //沒辦法,必須要用全局函數來裝數組,要不然無法從新定義
  2. TracePrint 約瑟夫環(100,3) //顯示函數運行結果
  3. Function 約瑟夫環(N,k)
  4. Dim i,t //定義變量
  5. For i = 1 To N //給換賦初始值
  6. 環=環&"|"&i
  7. Next
  8. 環 = Split(right(環,len(環)-1), "|")//因為多出一個 "|" 所以要用 right 去掉,然後用 split 轉換為數組
  9. Do //循環
  10. For i = 1 To k - 1//當數到 k-1 的時候,出列、并且入列到後面
  11. t = 出列
  12. Call 入列(t)
  13. Next
  14. Call 出列 //當為K值時,剔除
  15. Loop Until UBound(環)=0 //直到 換的最大下标為0結束
  16. 約瑟夫環 = 環(0) //返回結果
  17. End Function
  18. Function 出列()// 出列函數
  19. Dim t
  20. 出列 = 環(0)
  21. 環(0)="|"&環(0)&"|" //加 "|" 是為了區别出來是這個值,用 Filter 才不會出錯
  22. t = 環(0) // 用來做第二個參數, Filter不能調用自身做參數。
  23. 環 = Filter(環, t, 0) //利用 Filter 去除第一個數組元素
  24. End Function
  25. Sub 入列(值)
  26. Dim t
  27. t=UBound(環)
  28. Redim Preserve 環(t 1)
  29. 環(t 1) = 值
  30. End Sub

複制代碼

上面是我利用入列出列寫的約瑟夫環。主要思想為,數到的人就出列。如果數到并且不為K,那麼就入列到後面去。如果是K,那麼就退出環。一直到剩下最後一個人。代碼都在上面了,我已經把出列和入列操作融合到代碼裡面了。仔細看下就明白。這樣,小妖就把隊列說完了。當然了,實際運用的時候,比如廣度優先算法的核心就是這個隊列。還有很多算法,他們都是基于以上3個方法。所有如果大家把這幾個看懂了,很多很多算法,也就不在話下了。

最後,如果有看不懂的,或者什麼意見建議,歡迎加群讨論!554127455

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved