繼續讀啊哈磊《啊哈!算法》感悟系列——隊列
地鐵售票處排隊,先來的人先到隊首先買完先走,后來的人排在隊尾等候后買完后走。
想買票,必須排在隊尾;買完票,只能從隊首離開。
這種先進先出(First In First Out,FIFO),后進后出的線性隊伍,就是我們說的——隊列。
在現實中,隊列里包含的是人,在計算機的隊列里,包含的就是數據啦~所以,隊列是一種——數據結構。
隊列中的三要素為:隊伍,隊首,隊尾。
如果用我們比較熟悉的數組來表示隊列的話,隊伍就是數組本身,隊首和隊尾就是數組中相應索引位的數值元素。
這里用《潛伏》中的一個情節來舉一個應用隊列的例子:

軍統局給余則成一段數字,並告訴他只要按照指定的規則就可以將這段數字還原為情報密碼。
有一天,余則成從電台接到了這段數字:196811234567
情報轉譯規則如下:將第一個數字移到最后,摳去第二個數字,將第三個數字移到最后,扣去第四個數字……按照這個規則下去,直到這段數字最后只剩下一個數字為止,將之前扣去的數字和最后剩下的數字按順序連接起來,就是情報密碼。
拿1931這四個數字舉例,“[ ]”中代表扣去的數字:
第一次:[9]311
第二次:[1]13
第三次:[3]1
第四次:[1]
將“[ ]”中的數字按照你看到的從上到下的順序連接起來,就是情報密碼:9131。
這個規則就好比是排隊買票(把情報中的數字看成是人):

第一個人不買票,回到隊尾,讓第二個人先買;第三個人不買票,回到隊尾,讓第四個人先買……不用擔心,最后所有人都會買到票……
當然!現實生活中沒有這么謙讓的。我只是想要舉個例子來說明——這個情報轉譯的規則其實就是在對一個隊列進行着操作!
現在我們來把這個拆解情報的過程通過一段程序來搞定:
$qingBao = Read-Host "Please enter the information" $infoArray = New-Object System.Collections.ArrayList $infoArray.Add(0) for($i=0;$i -le $qingBao.length-1;$i++) { $infoArray.Add($qingBao[$i]) } function Translate($infoArray) { $head = 1 $tail = $infoArray.count $transArray = New-Object System.Collections.ArrayList while($head -le $tail) { $infoArray.Add($infoArray[$head]) $head++ $transArray.Add($infoArray[$head]) $tail++ $head++ } PrintTranslation $transArray } function PrintTranslation($transArray) { Write-Host "The translation is: " -ForegroundColor blue Write-Host $transArray -ForegroundColor green } Translate $infoArray
怎么樣,PowerShell中對動態數組的Add操作是不是非常方便呢?
在PowerShell ISE中運行該段代碼,並用1931這四個數字做一下測試,結果如下:


OK,我們的程序通過了測試。
現在對“196811234567”這串數字進行轉譯,結果如下:

計算機的運行速度是很快的。如果余則成活在今天會用計算機的話就再也不用人工的對密碼進行轉譯了。
不得不說潛伏在當今這個時代已經逐漸變成了黑客的世界,余則成不光要會偵查和反偵察,還要學習必要的算法與數據結構才行。

