摘要:原文地址學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)一棧和隊(duì)列博主博客地址的個(gè)人博客幾乎所有的編程語(yǔ)言都原生支持?jǐn)?shù)組類型,因?yàn)閿?shù)組是最簡(jiǎn)單的內(nèi)存數(shù)據(jù)結(jié)構(gòu)。他們就是棧和隊(duì)列。我們稱作棧頂,而另一端我們稱作棧底。移除棧頂?shù)脑兀瑫r(shí)返回被移除元素。
前言
只要你不計(jì)較得失,人生還有什么不能想法子克服的。
原文地址:學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)(一)——棧和隊(duì)列
博主博客地址:Damonare的個(gè)人博客
正文幾乎所有的編程語(yǔ)言都原生支持?jǐn)?shù)組類型,因?yàn)閿?shù)組是最簡(jiǎn)單的內(nèi)存數(shù)據(jù)結(jié)構(gòu)。javascript也有數(shù)組類型,而數(shù)組呢,其實(shí)就是一種特殊的?;蚴顷?duì)列,利用javascript?Array所內(nèi)置的API可以很方便的模擬棧和隊(duì)列。
棧我想對(duì)于數(shù)組每一個(gè)學(xué)過編程語(yǔ)言的都不會(huì)陌生吧,我們知道,我們可以在數(shù)組的任意位置添加或是刪除元素,然而,有時(shí)候我們還需要一種在添加或是刪除元素的時(shí)候有更多控制的數(shù)據(jù)結(jié)構(gòu)。有兩種數(shù)據(jù)結(jié)構(gòu)類似于數(shù)組。但在添加或是刪除元素的時(shí)候更為的可控。他們就是棧和隊(duì)列。
棧是一種遵從后進(jìn)先出(LIFO)原則的有序集合。新添加的或是待刪除的元素都保存在棧的末尾。我們稱作棧頂,而另一端我們稱作棧底。
在現(xiàn)實(shí)生活中就有很多棧的例子,比如下圖的書本,這一摞書如果要取肯定是先去最上面的那一本,但它是最后一個(gè)放上去的,也就是棧頂?shù)脑囟际谴砑踊蚴谴齽h除的。這就是后進(jìn)先出的實(shí)際例子。
棧的創(chuàng)建
首先我們先創(chuàng)建一個(gè)類:
function Stack(){ //各種屬性和方法的聲明 }
然后我們需要一種數(shù)據(jù)結(jié)構(gòu)來保存棧里面的數(shù)據(jù):
var items=[];
接下來,我們需要給棧聲明一些方法:
push(element):添加一個(gè)或是幾個(gè)新元素到棧頂。
pop():移除棧頂?shù)脑?,同時(shí)返回被移除元素。
peek():返回棧頂?shù)脑?,但并不?duì)棧頂?shù)脑刈龀鋈魏蔚男薷摹?/p>
isEmpty():檢查棧內(nèi)是否有元素,如果有返回true,沒有返回false。
clear():清除棧里的元素。
size():返回棧的元素個(gè)數(shù)。
print():打印棧里的元素。
棧的完整代碼我們通過javascript提供的API,實(shí)現(xiàn)棧如下:
function Stack() { var items = []; this.push = function(element){ items.push(element); }; this.pop = function(){ return items.pop(); }; this.peek = function(){ return items[items.length-1]; }; this.isEmpty = function(){ return items.length == 0; }; this.size = function(){ return items.length; }; this.clear = function(){ items = []; }; this.print = function(){ console.log(items.toString()); }; this.toString = function(){ return items.toString(); }; }使用棧
創(chuàng)建完了棧,也給他了方法,然后我們來實(shí)例化一個(gè)對(duì)象:
var stack=new Stack(); console.log(stack.isEmpty()); //true stack.push(1); stack.push(3); //添加元素 console.log(stack.peek()); //輸出棧頂元素3 console.log(stack.size()); //2 //輸出元素個(gè)數(shù)
其余方法調(diào)用讀者可自行嘗試。
隊(duì)列**我們已經(jīng)接觸了棧,接下來要說的隊(duì)列和棧十分相似,他們都是線性表,元素都是有序的
。隊(duì)列和棧不同的是,隊(duì)列遵循的是FIFO,也就是先進(jìn)先出的原則。隊(duì)列從尾部添加新元素,從頂部移除元素,最新添加的元素必須排列在隊(duì)列的末尾。**
在現(xiàn)實(shí)生活中,最常見的隊(duì)列就是排隊(duì),如下圖,先進(jìn)入隊(duì)列的先接受服務(wù),后進(jìn)入隊(duì)列的必須排在隊(duì)列末尾。
隊(duì)列的創(chuàng)建
首先我們聲明一個(gè)類:
function(){ //這里是隊(duì)列的屬性和方法 }
然后我們同樣創(chuàng)建一個(gè)保存元素的數(shù)組:
var items=[];
接下來聲明一些隊(duì)列可用的方法:
enqueue(element):向隊(duì)列尾部添加一個(gè)(或是多個(gè))元素。
dequeue():移除隊(duì)列的第一個(gè)元素,并返回被移除的元素。
front():返回隊(duì)列的第一個(gè)元素——最先被添加的也是最先被移除的元素。隊(duì)列不做任何變動(dòng)。
isEmpty():檢查隊(duì)列內(nèi)是否有元素,如果有返回true,沒有返回false。
size():返回隊(duì)列的長(zhǎng)度。
print():打印隊(duì)列的元素。
隊(duì)列的完整代碼我們通過javascript提供的API,實(shí)現(xiàn)隊(duì)列如下:
function Queue() { var items = []; this.enqueue = function(element){ items.push(element); }; this.dequeue = function(){ return items.shift(); }; this.front = function(){ return items[0]; }; this.isEmpty = function(){ return items.length == 0; }; this.clear = function(){ items = []; }; this.size = function(){ return items.length; }; this.print = function(){ console.log(items.toString()); }; }使用隊(duì)列
創(chuàng)建完了隊(duì)列,也給他了方法,然后我們來實(shí)例化一個(gè)對(duì)象:
var queue=new Queue(); console.log(queue.isEmpty()); //true queue.enqueue(1); queue.enqueue(3); //添加元素 console.log(queue.front()); //返回隊(duì)列的第一個(gè)元素1 console.log(queue.size()); //2 //輸出元素個(gè)數(shù)后記
這篇博客使用javascript實(shí)現(xiàn)了棧和隊(duì)列這兩種數(shù)據(jù)結(jié)構(gòu)。關(guān)于具體的應(yīng)用的有機(jī)會(huì)補(bǔ)上。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87996.html
摘要:就那么回事后記說到現(xiàn)在一直都是線性表,就是順序數(shù)據(jù)結(jié)構(gòu),他們都是有順序的,數(shù)據(jù)都是一條繩子上的螞蚱。那么,如果數(shù)據(jù)是沒有順序的呢那又該使用哪種數(shù)據(jù)結(jié)構(gòu)呢這個(gè)放到學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)三集合中學(xué)習(xí)。 前言 人生總是直向前行走,從不留下什么。 原文地址:學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)(二)——鏈表 博主博客地址:Damonare的個(gè)人博客 正文 鏈表簡(jiǎn)介 ????上一篇博客-學(xué)習(xí)javascrip...
摘要:用兩個(gè)棧實(shí)現(xiàn)隊(duì)列用兩個(gè)棧來實(shí)現(xiàn)一個(gè)隊(duì)列,完成隊(duì)列的和操作。隊(duì)列中的元素為類型。 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列 用兩個(gè)棧來實(shí)現(xiàn)一個(gè)隊(duì)列,完成隊(duì)列的Push和Pop操作。 隊(duì)列中的元素為int類型。 var stack1 = []; var stack2 = []; function push(node){ stack1.push(node); } function pop(){ if(sta...
摘要:技巧使你的更加專業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...
摘要:技巧使你的更加專業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...
摘要:移除數(shù)組第一項(xiàng)并返回該項(xiàng)同時(shí)將數(shù)組的長(zhǎng)度減一。簡(jiǎn)單實(shí)現(xiàn)棧使用和結(jié)合實(shí)現(xiàn)簡(jiǎn)單棧簡(jiǎn)單實(shí)現(xiàn)隊(duì)列使用與結(jié)合實(shí)現(xiàn)簡(jiǎn)單隊(duì)列額外補(bǔ)充與用途相反,在數(shù)組前端添加任意個(gè)項(xiàng),并返回新數(shù)組的長(zhǎng)度。 棧和隊(duì)列 棧:LIFO(先進(jìn)后出)一種數(shù)據(jù)結(jié)構(gòu)隊(duì)列:LILO(先進(jìn)先出)一種數(shù)據(jù)結(jié)構(gòu) 使用的js方法 1.push();可以接收任意數(shù)量的參數(shù),把它們逐個(gè)推進(jìn)隊(duì)尾(數(shù)組末尾),并返回修改后的數(shù)組長(zhǎng)度。2.po...
閱讀 1310·2021-11-16 11:45
閱讀 2233·2021-11-02 14:40
閱讀 3872·2021-09-24 10:25
閱讀 3029·2019-08-30 12:45
閱讀 1255·2019-08-29 18:39
閱讀 2468·2019-08-29 12:32
閱讀 1588·2019-08-26 10:45
閱讀 1917·2019-08-23 17:01