摘要:于是翻出了機房里的這本學習數(shù)據(jù)結(jié)構(gòu)與算法開始學習程序員的基礎知識。這本書用了我最熟悉的來實現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)和算法,而且書很薄,可以說是一本不錯的入門教程。隊列在頭部刪除元素,尾部添加元素。
起因本系列所有文章:
第一篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列
第二篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之鏈表
第三篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之集合
第四篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表
第五篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之二叉搜索樹
最近要準備校招,打開某網(wǎng)站準備開始刷題,發(fā)現(xiàn)算法題根本無法動手,于是覺得這塊需要惡補。(⊙v⊙)嗯,至少得先知道概念吧。于是翻出了機房里的這本《學習JavaScript數(shù)據(jù)結(jié)構(gòu)與算法》開始學習程序員的基礎知識。這本書用了我最熟悉的JS來實現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)和算法,而且書很薄,可以說是一本不錯的入門教程。雖然我是個前端,但是計算機基礎不能丟下。
棧??梢岳斫鉃橐环N特殊的數(shù)組。遵循后進先出(LIFO)的原則,元素在棧頂添加和刪除。生活中常用來比作棧的例子主要是一疊盤子或一堆書,但是我覺得不夠形象,因為盤子或書可以從中間被抽走。所以我一般把??闯蓮椣?,想象一下子彈被一個個推進彈匣中,比如下圖:
(圖片來自谷歌搜索,侵刪)
用JavaScript實現(xiàn)棧聲明一個構(gòu)造函數(shù):
function Stack () { // 使用數(shù)組來保存棧元素 var items = [] }
為棧聲明一些方法:
push(elements(s)):添加一個或多個元素到棧頂
pop():刪除位于棧頂?shù)脑兀⒎祷卦撛?/p>
peek():返回棧頂元素
isEmpty():當前棧為空則返回true,否則為false
size():返回棧的元素個數(shù)
clear():清空棧
實現(xiàn)push用數(shù)組的push方法向數(shù)組末尾添加新元素,實現(xiàn)元素入棧
// 棧頂添加 this.push = function (element) { items.push(element) }實現(xiàn)pop
用數(shù)組的pop方法在數(shù)組末尾刪除一個元素,并返回刪除元素,實現(xiàn)元素出棧
// 棧頂刪除并返回刪除元素 this.pop = function () { return items.pop() }實現(xiàn)peek
棧頂就是數(shù)組最后一個元素,使用Array[Array.length - 1]獲得
// 返回棧頂元素 this.peek = function () { return items[items.length - 1] }實現(xiàn)其他方法
隊列里面也用了這些方法,為避免重復,就先多帶帶拿出來了。
// 棧是否為空 this.isEmpty = function () { return items.length === 0 } // 返回棧里的元素個數(shù) this.size = function () { return items.length } // 清空棧 this.clear = function () { items = [] } // 打印棧 this.print = function () { console.log(items.toString()) }棧的應用
書上的例子有將十進制轉(zhuǎn)二進制,這里我把后面那個十進制轉(zhuǎn)任意進制的代碼貼出來。
十進制轉(zhuǎn)二進制原理很簡單:把十進制數(shù)不斷除以2直到為0,然后把每次的余數(shù)拼接到一起就是二進制數(shù)。
轉(zhuǎn)其他進制也是類似的方法,只不過是把除以2換成其他數(shù)而已。代碼如下:
// 把十進制轉(zhuǎn)成任何進制 function BaseConverter (decNumber, base) { var remStack = new Stack(), rem, binaryString = "", digits = "0123456789ABCDEF" // 判斷十進制數(shù)是否為0,把余數(shù)推入棧中 while (decNumber > 0) { rem = Math.floor(decNumber % base) remStack.push(rem) decNumber = Math.floor(decNumber / base) } // 把棧中的元素拼接打印出來 while (!remStack.isEmpty()) { binaryString += digits[remStack.pop()] } // 返回轉(zhuǎn)換的二進制數(shù) return binaryString }
這里的decNumber是要轉(zhuǎn)換的十進制數(shù),base是要轉(zhuǎn)換的進制,remStack是上面Stack的實例,在remStack中操作棧的方法。這里的digits是對打印出來的數(shù)做一個處理,比如十六進制的數(shù)余數(shù)會大于9,那么就要用A、B、C、D、E、sF來表示10~15。
棧的學習暫時就這樣了,這里貼上代碼地址,有興趣的可以看看:
隊列棧的實現(xiàn)-源代碼
和棧很類似,只是原則不同,隊列是先進先出(FIFO),又稱先來先服務。隊列在頭部刪除元素,尾部添加元素。生活中隊列的例子就是排隊了,這也很容易理解。
用JavaScript實現(xiàn)隊列同樣聲明構(gòu)造函數(shù):
function Queue () { var items = [] }
隊列的方法:
enqueue(elements(s)):向隊列尾部添加一個或多個元素
dequeue():移除隊列頭部的元素并返回
front():返回隊列頭部的元素
其他的和棧一樣。
實現(xiàn)enqueue用push方法推入元素
// 向隊列尾部添加元素 this.enqueue = function (element) { items.push(element) }實現(xiàn)dequeue
用shift方法刪除第一個數(shù)組元素,并返回刪除的元素
// 刪除隊列頭部的元素并返回刪除元素 this.dequeue = function () { return items.shift() }實現(xiàn)front
直接返回第一個數(shù)組元素
// 返回隊列頭部的元素 this.front = function () { return items[0] }隊列的應用
書上有講優(yōu)先隊列和循環(huán)隊列的應用,這里就簡單講一下優(yōu)先隊列的原理:
要實現(xiàn)優(yōu)先隊列有兩種思路:一是將元素按正確的位置添加到隊列中,然后元素正常在隊列頭部被刪除;二是元素在隊列尾部不按優(yōu)先級正常入列,然后按優(yōu)先級刪除對應元素。
書上是按第一種思路實現(xiàn)的優(yōu)先隊列,這里限于篇幅就貼上代碼地址:
隊列的實現(xiàn)-源代碼
接下來談談循環(huán)隊列的應用——擊鼓傳花游戲
function hotPotato (nameList, num) { var queue = new Queue() // 參與者的名字入列 for (var i = 0; i < nameList.length; i++) { queue.enqueue(nameList[i]) } var eliminated = "" // 隊列中的最后一個人為勝者 while (queue.size() > 1) { // 按設定的擊鼓次數(shù),每個人都從隊列頭部出列轉(zhuǎn)到隊列尾部(模擬傳花) for (var i = 0; i < num; i++) { queue.enqueue(queue.dequeue()) } // 到了規(guī)定次數(shù)后,在隊列頭部的人(相當于拿到花)被淘汰 eliminated = queue.dequeue() console.log(eliminated + "在擊鼓傳花游戲中被淘汰") } // 勝者出列并被返回 return queue.dequeue() }
其中nameList是參與游戲的名字列表,num是擊鼓次數(shù)。
隊列學習就暫時到這里,明天繼續(xù)學習鏈表。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84767.html
摘要:所謂數(shù)組英語,是有序的元素序列。組成數(shù)組的各個變量稱為數(shù)組的分量,也稱為數(shù)組的元素,有時也稱為下標變量。在棧中添加數(shù)據(jù)和刪除數(shù)據(jù)也被稱為推入和彈出,而且推入和彈出只會發(fā)生在棧的頂部。棧是一種數(shù)據(jù)結(jié)構(gòu),而隊列則是一種的數(shù)據(jù)結(jié)構(gòu),即先進先出。 所謂數(shù)組(英語:Array),是有序的元素序列。 若將有限個類型相同的變量的集合命名,那么這個名稱為數(shù)組名。 組成數(shù)組的各個變量稱為數(shù)組的分量,也稱...
摘要:本系列所有文章第一篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列第二篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之二叉搜索樹簡單介紹鏈表鏈表一種常見的數(shù)據(jù)結(jié)構(gòu),可 本系列所有文章:第一篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列第二篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學習數(shù)...
本系列所有文章:第一篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列第二篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之二叉搜索樹 集合簡介 記得高一數(shù)學第一節(jié)課學的就是集合,現(xiàn)在快大四了再看到它有種見了老朋友的感覺。哈哈,閑話不多扯,進入正題。 集合是由一組無序且不重復的項組成的數(shù)據(jù)結(jié)構(gòu)。這里集合的概念和高中數(shù)學...
摘要:刪除數(shù)組元素的開始索引需要刪除元素的個數(shù),插入數(shù)組的元素語法因為參數(shù)變化多樣,我們主要從三個方面來展示的用法。 今天是我們介紹數(shù)組系列文章的第五篇,也是我們數(shù)組系列的最后一篇文章,只是數(shù)據(jù)系列的結(jié)束,所以大家不用擔心,我們會持續(xù)的更新干貨文章。 生命不息,更新不止! 今天我們就不那么多廢話了,直接干貨開始。 我們在《Javascript數(shù)組系列一之棧與隊列》中描述我們是如何利用 pus...
閱讀 727·2023-04-25 22:50
閱讀 1580·2021-10-08 10:05
閱讀 1004·2021-09-30 09:47
閱讀 1955·2021-09-28 09:35
閱讀 857·2021-09-26 09:55
閱讀 3451·2021-09-10 10:51
閱讀 3455·2021-09-02 15:15
閱讀 3323·2021-08-05 09:57