亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript數(shù)據(jù)結(jié)構(gòu)《?!?

nanchen2251 / 427人閱讀

摘要:我們都知道數(shù)組是里面比較常用的一種數(shù)據(jù)結(jié)構(gòu),棧和數(shù)組類似,定義如下棧是一種遵從后進(jìn)先出原則的有序集合。新增加和待刪除的元素都保存在棧的尾部,也稱棧頂,相反的另一端就叫棧底,在棧的這種數(shù)據(jù)結(jié)構(gòu)里面,我們新增的元素都在棧頂,舊的元素都在棧底。

由于不是計(jì)算機(jī)專業(yè)出身,對(duì)數(shù)據(jù)結(jié)構(gòu)這些了解的比較少,最近看了一些相關(guān)的書(shū)籍,這里做一些總結(jié)。本篇要說(shuō)的是棧。我們都知道數(shù)組是JavaScript里面比較常用的一種數(shù)據(jù)結(jié)構(gòu),棧和數(shù)組類似,定義如下

棧是一種遵從后進(jìn)先出 (LIFO) 原則的有序集合。 新增加和待刪除的元素都保存在棧的尾部,也稱棧頂,相反的另一端就叫棧底,在棧的這種數(shù)據(jù)結(jié)構(gòu)里面,我們新增的元素都在棧頂,舊的元素都在棧底。

舉一個(gè)生活中的例子,我們平時(shí)吃完飯洗盤(pán)子的時(shí)候,我們都會(huì)把洗好的盤(pán)子一個(gè)個(gè)堆疊起來(lái),先放進(jìn)去的盤(pán)子就是我們棧里面比較舊的元素(棧底),后放的盤(pán)子就是比較新的盤(pán)子(棧頂),然后我們要把一個(gè)盤(pán)子拿下來(lái)的時(shí)候我們都是從上面開(kāi)始拿(棧頂),這里就是后放進(jìn)去的盤(pán)子先拿出來(lái)了,所以這里就遵循了后進(jìn)先出 (LIFO) 的原則了。

代碼實(shí)現(xiàn)

代碼全部采用ES6的語(yǔ)法,首先我們定義一個(gè)類Stack來(lái)表示棧,然后為該類實(shí)現(xiàn)一些方法來(lái)模擬棧的行為

class Stack {

  constructor() {
    // 定義一個(gè)數(shù)組來(lái)保存棧里面的元素
    this.items = []
  }

  // 添加元素到棧頂
  push() { }
  // 從棧頂移除元素,同時(shí)返回被移除元素
  pop() { }
  // 返回棧頂?shù)脑?,不?duì)棧本身做修改
  peek() { }
  // 判斷棧是否為空
  isEmpty() { }
  // 清空棧
  remove() { }
  // 返回棧里面元素的個(gè)數(shù)
  length() { }
}

這樣我們就定義好一個(gè)基類了,下面來(lái)分別實(shí)現(xiàn)棧的行為方法

push

我們要實(shí)現(xiàn)的第一個(gè)方法(行為)就是push,push方法會(huì)向棧的棧頂新增元素,因?yàn)槲覀兪怯脭?shù)組來(lái)保存棧里面的元素的,所以這個(gè)方法的實(shí)現(xiàn)很簡(jiǎn)單,直接用JavaScript數(shù)組的push方法就好了。

push(item) {
    this.items.push(item)
}
pop

接下來(lái)要實(shí)現(xiàn)是pop方法(行為),pop會(huì)移除棧頂?shù)脑夭⑶視?huì)返回被移除的元素,這個(gè)方法我們同樣可以用JavaScript數(shù)組的pop方法來(lái)實(shí)現(xiàn)

pop() {
    return this.items.pop()
}
peek

peek方法(行為)返回棧頂?shù)淖詈笠粋€(gè)元素,不對(duì)棧本身做修改,我們可以用Array.length-1來(lái)獲取數(shù)組的最后一個(gè)元素,所以peek方法可以這樣寫(xiě)

peek() {
    return this.items[this.items.length-1]
}
isEmpty

isEmpty方法用來(lái)判斷棧是否為空,用數(shù)組來(lái)表示就是數(shù)組的 length 是否等于0,所以我們可以得出如下代碼

isEmpty() {
    return this.items.length === 0
}
remove

remove 方法用來(lái)清空棧里面所有的元素,實(shí)現(xiàn)這個(gè)方法是最簡(jiǎn)單的了,直接讓數(shù)組等于一個(gè)新的空數(shù)組就好了

remove() {
    this.items = []
}
length

最后要實(shí)現(xiàn)的是length方法,length方法返回棧的大小,這個(gè)同樣可以用數(shù)組的length來(lái)實(shí)現(xiàn)

length() {
    return this.items.length
}

這里我們添加一個(gè)輔助print方法來(lái)打印棧里面的元素,方便我們觀察調(diào)試,這個(gè)方法和棧的行為無(wú)關(guān),只是一個(gè)輔助方法

print(){
    this.items.forEach((item, index) => {
        console.log(`${index+1}:${item}`)
    })
}

最后完整的代碼如下

class Stack {

  constructor() {
    this.items = []  // 定義一個(gè)數(shù)組來(lái)保存棧里面的元素
  }
  // 添加元素到棧頂
  push(item) {
    this.items.push(item)
  }
  // 從棧頂移除元素,同時(shí)返回被移除元素
  pop() {
    return this.items.pop()
  }
  // 返回棧頂?shù)脑兀粚?duì)棧本身做修改
  peek() {
    return this.items[this.items.length-1]
  }
  // 判斷棧是否為空
  isEmpty() {
    return this.items.length === 0
  }
  // 清空棧
  remove() {
    this.items = []
  }
  // 返回棧里面元素的個(gè)數(shù)
  length() {
    return this.items.length
  }

  print() {
    this.items.forEach((item, index) => {
        console.log(`${index+1}:${item}`)
    })
  }
}

這樣這個(gè)棧就基本實(shí)現(xiàn)了,下面來(lái)實(shí)際運(yùn)行一下實(shí)現(xiàn)好的這個(gè)Stack類,首先我們需要實(shí)例化這個(gè)類,然后分別調(diào)用實(shí)例的方法來(lái)查看效果

const myStack = new Stack()  //  實(shí)例化

myStack.isEmpty() // true

myStack.push("這是棧的第一個(gè)元素") 
myStack.push("這是棧的第二個(gè)元素") 

myStack.print() // 1: 這是棧的第一個(gè)元素 2:這是棧的第二個(gè)元素

myStack.peek() // 這是棧的第二個(gè)元素

myStack.pop() // 這是棧的第一個(gè)元素

myStack.length() // 1

myStack.isEmpty() // false

myStack.remove() // 這時(shí)棧里面已經(jīng)沒(méi)有元素了

myStack.isEmpty() // true

棧的基本說(shuō)明就到此了,下篇會(huì)總結(jié)一下和棧類似的數(shù)據(jù)結(jié)構(gòu),隊(duì)列。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/88657.html

相關(guān)文章

  • javasctipt 工作原理之調(diào)用

    摘要:譯者注翻譯一個(gè)對(duì)新手比較友好的工作原理解析系列文章注意以下全部是概念經(jīng)驗(yàn)豐富的老鳥(niǎo)可以離場(chǎng)啦正文從這里開(kāi)始隨著的流行團(tuán)隊(duì)們正在利用來(lái)支持多個(gè)級(jí)別的技術(shù)棧包括前端后端混合開(kāi)發(fā)嵌入式設(shè)備以及更多這篇文章旨在成為深入挖掘和實(shí)際上他是怎么工作的系列 譯者注 翻譯一個(gè)對(duì)新手比較友好的 JavaScript 工作原理解析系列文章 注意: 以下全部是概念,經(jīng)驗(yàn)豐富的老鳥(niǎo)可以離場(chǎng)啦 正文從這里開(kāi)始 隨...

    Pines_Cheng 評(píng)論0 收藏0
  • 前端進(jìn)擊的巨人(二):、堆、隊(duì)列、內(nèi)存空間

    摘要:中有三種數(shù)據(jù)結(jié)構(gòu)棧堆隊(duì)列。前端進(jìn)擊的巨人一執(zhí)行上下文與執(zhí)行棧,變量對(duì)象中解釋執(zhí)行棧時(shí),舉了一個(gè)乒乓球盒子的例子,來(lái)演示棧的存取方式,這里再舉個(gè)栗子搭積木。對(duì)于基本類型,棧中存儲(chǔ)的就是它自身的值,所以新內(nèi)存空間存儲(chǔ)的也是一個(gè)值。 面試經(jīng)常遇到的深淺拷貝,事件輪詢,函數(shù)調(diào)用棧,閉包等容易出錯(cuò)的題目,究其原因,都是跟JavaScript基礎(chǔ)知識(shí)不牢固有關(guān),下層地基沒(méi)打好,上層就是豆腐渣工程,...

    edgardeng 評(píng)論0 收藏0
  • [譯文] JavaScript工作原理:引擎、運(yùn)行時(shí)、調(diào)用概述

    摘要:調(diào)用棧是單線程編程語(yǔ)言,意味著它只有單一的調(diào)用棧。調(diào)用棧是一種數(shù)據(jù)結(jié)構(gòu),基本記錄了程序運(yùn)行的位置。舉個(gè)例子,先來(lái)看如下所示的代碼當(dāng)引擎開(kāi)始執(zhí)行這段代碼時(shí),調(diào)用棧將是空的。這正是拋出異常時(shí)棧追蹤的構(gòu)造過(guò)程這基本上就是異常拋出時(shí)調(diào)用棧的狀態(tài)。 原文 How JavaScript works: an overview of the engine, the runtime, and the c...

    PAMPANG 評(píng)論0 收藏0
  • 理解 JavaScript 執(zhí)行

    摘要:執(zhí)行棧所有的代碼在運(yùn)行時(shí)都是在執(zhí)行上下文中進(jìn)行的。引擎執(zhí)行棧頂?shù)暮瘮?shù),執(zhí)行完畢,彈出當(dāng)前執(zhí)行上下文。但是這里我們也可以用執(zhí)行棧來(lái)解釋。 這是 JavaScript 系列的第 3 篇。 引例 首先來(lái)看一個(gè)引例: function foo() { console.log(1); bar(); console.log(3); } function bar() { conso...

    yacheng 評(píng)論0 收藏0
  • Javascript】探究javascript中的堆//任務(wù)隊(duì)列與并發(fā)模型 event loop

    摘要:而函數(shù)調(diào)用結(jié)束返回時(shí),運(yùn)行時(shí)會(huì)將棧頂?shù)恼{(diào)用結(jié)構(gòu)彈出。并發(fā)模型與引擎是單線程的,它的并發(fā)模型基于事件循環(huán)當(dāng)線程中的同步任務(wù)執(zhí)行完,執(zhí)行棧為空時(shí),則從任務(wù)隊(duì)列中取出異步任務(wù)進(jìn)行處理。在當(dāng)前的微任務(wù)沒(méi)有執(zhí)行完成時(shí),是不會(huì)執(zhí)行下一個(gè)宏任務(wù)的。 堆/棧/隊(duì)列 在javascript中,存在調(diào)用棧 (call stack)和內(nèi)存堆(memory heap) ,程序中函數(shù)依次進(jìn)入棧中等待執(zhí)行,若執(zhí)行...

    desdik 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<