成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí):棧

Alfred / 1290人閱讀

摘要:棧的應(yīng)用前面介紹了那么多棧相關(guān)的知識,最后也是介紹棧的應(yīng)用場景的時候了,棧的實際應(yīng)用非常廣泛,例如用來存儲訪問過的任務(wù)或路徑撤銷的操作。

棧的定義

什么是棧?棧是一種遵循后進(jìn)先出原則的有序集合,新添加的或者待刪除的元素都保存在棧的同一端,稱為棧頂,另一端稱為棧底,在棧里,新元素靠近棧頂,舊元素靠近棧底,用個圖來看大概這樣式的:

用一個更形象的例子來說明:上網(wǎng)的時候,每點擊一個超鏈接,瀏覽器都會打開一個新的頁面,并且壓入到一個訪問歷史棧中,你可以不斷的點擊打開新的頁面,但總是可以通過回退重新訪問以前的頁面,從瀏覽器的訪問歷史棧中彈出歷史網(wǎng)頁地址,從棧頂彈出,總是最新的最先彈出

棧的創(chuàng)建

首先創(chuàng)建一個類用來表示棧,接著聲明一個數(shù)組用來保存棧里的元素:

function Stack() {
  let items = []
  // 方法聲明
}

創(chuàng)建好棧之后,需要為棧聲明一些方法,棧一般會包含以下幾個方法:

push(): 添加新元素到棧頂

pop(): 移除棧頂?shù)脑?,同時返回被移除的元素

peek(): 返回棧頂?shù)脑兀粚W鋈魏涡薷?/p>

isEmpty(): 如果棧里沒有任何元素就返回true,否則返回false

clear(): 移除棧里的所有元素

size(): 返回棧里的元素個數(shù)

具體實現(xiàn):

function Stack() {
  let items = []
  // 添加元素到棧頂,也就是棧的末尾
  this.push = function (element) {
    items.push(element)
  }
  // 棧的后進(jìn)先出原則,從棧頂出棧
  this.pop = function () {
    return items.pop()
  }
  // 查看棧頂?shù)脑兀L問數(shù)組最后一個元素
  this.peek = function () {
    return items[items.length - 1]
  }
  // 檢查棧是否為空
  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())
  }
}
棧的使用

現(xiàn)在我們來看如何使用棧:

let stack = new Stack()
stack.push(1)
stack.push(2)
stack.push(3)
console.log(stack.peek()) // 3
console.log(stack.isEmpty()) // false
console.log(stack.size()) // 3

先向棧中加入三個元素1,2,3,接下來用一張圖來看一下入棧的過程:

入棧過程都是在棧頂依次入棧,接著調(diào)用peek方法返回棧頂元素3,isEmpty返回false,size返回棧的長度3,然后在繼續(xù)調(diào)用pop來看看出棧的過程:

stack.pop()
stack.print() // 1,2


出棧也是和入棧相同,都是從棧頂開始出棧,保證棧的后入先出原則

es6聲明Stack類

上面創(chuàng)建了一個Stack函數(shù)來充當(dāng)類,并且在里面聲明了一個私有變量,但是在es6里面是有類的語法的,可以直接用es6新語法來聲明,代碼大概是這樣事的:

class Stack {
  constructor () {
    this.items = []
  }
  push (element) {
    this.items.push(element)
  }
  pop () {
    return this.items.pop()
  }
  peek () {
    return this.items[items.length - 1]
  }
  isEmpty () {
    return this.items.length == 0
  }
  size () {
    return this.items.length
  }
  clear () {
    this.items = []
  }
  print () {
    console.log(this.items.toString())
  }
}
let stack = new Stack()
stack.push(1)
console.log(stack.isEmpty())
stack.print()

看起來似乎不錯,比之前要簡單,關(guān)鍵是看起來更加合理,使用的是類的語法,調(diào)用也沒有什么問題,但是如果這么執(zhí)行呢?

console.log(stack.items)

會發(fā)現(xiàn)一個問題,在stack類外面可以直接訪問類里面的屬性,按照設(shè)計items應(yīng)該是Stack類的私有屬性才對,就像之前Stack函數(shù)里面的私有變量,是不能在外部訪問的,如何才能將items變成私有屬性呢?應(yīng)該會有和我一樣想法的人,使用閉包,在閉包里面里面定義私有屬性,然后再將stack類返回回來,代碼實現(xiàn)大概是這樣的:

let Stack = (function () {
  let items = new WeakMap()
  class Stack {
    constructor () {
      items.set(this, [])
    }
    push (element) {
      let s = items.get(this)
      s.push(element)
    }
    pop () {
      let s = items.get(this)
      return s.pop()
    }
    peek () {
      let s = items.get(this)
      return s[s.length - 1]
    }
    isEmpty () {
      let s = items.get(this)
      return s.length == 0
    }
    size () {
      let s = items.get(this)
      return s.length
    }
    clear () {
      let s = items.get(this)
      s = []
    }
    print () {
      let s = items.get(this)
      console.log(s.toString())
    }
  }
  return Stack
})()

可能有人會問為什么這里要把items定義成一個WeakMap對象,先簡單介紹一下WeakMap對象的用法,WeakMap對象是一對鍵/值對的集合,其鍵必須是對象,值可以是任意的,定義成WeakMap就是為了將items屬性變成私有屬性,在外部調(diào)用Stack對象的時候無法訪問到items屬性。

棧的應(yīng)用

前面介紹了那么多棧相關(guān)的知識,最后也是介紹棧的應(yīng)用場景的時候了,棧的實際應(yīng)用非常廣泛,例如用來存儲訪問過的任務(wù)或路徑、撤銷的操作。為了有一個更直觀的應(yīng)用了解,下面會介紹如何用來解決計算機中的進(jìn)制轉(zhuǎn)換問題,將10進(jìn)制轉(zhuǎn)換為其他進(jìn)制數(shù),可能不少人已經(jīng)忘了如何進(jìn)行進(jìn)制轉(zhuǎn)換了,下面先來看一個簡單的10進(jìn)制轉(zhuǎn)2進(jìn)制的過程:


上面的圖中展示將一個10進(jìn)制8轉(zhuǎn)化為2進(jìn)制數(shù)的過程,接下來看看用棧是如何實現(xiàn)的:

function conver(num, radix) {
  let stack = new Stack()
  let binaryString = ""
  let digits = "0123456789ABCDEF"
  while (num > 0) {
    stack.push(num % radix)
    num = parseInt(num / radix)
  }
  while (!stack.isEmpty()) {
    binaryString += digits[stack.pop()]
  }
  console.log(binaryString)
}
conver(8, 2) // 1000
總結(jié)

這篇文章主要對棧做了簡單介紹,動手實踐了棧的實現(xiàn),以及用棧實現(xiàn)了一個簡單進(jìn)制轉(zhuǎn)換的功能。如果有錯誤或不嚴(yán)謹(jǐn)?shù)牡胤?,歡迎批評指正,如果喜歡,歡迎點贊。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108885.html

相關(guān)文章

  • 我對JS的簡單學(xué)習(xí)

    摘要:我對棧的學(xué)習(xí)因為是個新手,所以都是最簡單的知識學(xué)習(xí)梳理。棧是一種遵從后進(jìn)先出原則的有序集合,新添加的或者待刪除的元素都保留在棧的末尾,稱作棧頂,另一端叫做棧底。棧的學(xué)習(xí)棧的創(chuàng)建創(chuàng)建一個類來表示棧。對于棧來說只能用和方法來進(jìn)行添加和刪除元素。 我對棧的學(xué)習(xí) 因為是個新手,所以都是最簡單的知識學(xué)習(xí)梳理。 什么是棧 數(shù)組是計算機科學(xué)中最常用的數(shù)據(jù)結(jié)構(gòu),是數(shù)據(jù)元素的集合。有時候我們需要一種添加...

    Cobub 評論0 收藏0
  • JS

    摘要:棧學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法讀書筆記。棧又名堆棧,是一種遵循后進(jìn)先出原則的有序集合。新添加或待刪除的元素都保存在棧的末尾,稱作棧頂,另一端稱作棧底。在棧里,新元素都靠近棧頂,舊元素都接近棧底。 棧 《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法》讀書筆記。 棧(stack)又名堆棧,是一種遵循后進(jìn)先出(LIFO)原則的有序集合。新添加或待刪除的元素都保存在棧的末尾,稱作棧頂,另一端稱作棧底。在棧里,...

    Lin_R 評論0 收藏0
  • 開發(fā):2017年你最好的選擇[翻譯]

    摘要:全棧開發(fā)是一個學(xué)習(xí)實現(xiàn)提高的過程。解除對開發(fā)人員的限制所有的職業(yè)都在持續(xù)的進(jìn)化。哪怕是爆炸和擁擠的印度招聘市場,全棧工程師在年也非常的搶手。印度的創(chuàng)業(yè)公司已經(jīng)開發(fā)意識到全棧工程師的重要意義,全棧會越來越重要。 在不斷壯大的招聘市場上,最需要的是有非常廣泛技術(shù)棧的人。 前言 敬愛的讀者,大家好。大家經(jīng)常討論的話題是作為一個軟件工程師是一個持續(xù)學(xué)習(xí)的過程。因為現(xiàn)有的趨勢和技術(shù)在軟件領(lǐng)域會很...

    fireflow 評論0 收藏0
  • 開發(fā):2017年你最好的選擇[翻譯]

    摘要:全棧開發(fā)是一個學(xué)習(xí)實現(xiàn)提高的過程。解除對開發(fā)人員的限制所有的職業(yè)都在持續(xù)的進(jìn)化。哪怕是爆炸和擁擠的印度招聘市場,全棧工程師在年也非常的搶手。印度的創(chuàng)業(yè)公司已經(jīng)開發(fā)意識到全棧工程師的重要意義,全棧會越來越重要。 在不斷壯大的招聘市場上,最需要的是有非常廣泛技術(shù)棧的人。 前言 敬愛的讀者,大家好。大家經(jīng)常討論的話題是作為一個軟件工程師是一個持續(xù)學(xué)習(xí)的過程。因為現(xiàn)有的趨勢和技術(shù)在軟件領(lǐng)域會很...

    aisuhua 評論0 收藏0
  • 開發(fā):2017年你最好的選擇[翻譯]

    摘要:全棧開發(fā)是一個學(xué)習(xí)實現(xiàn)提高的過程。解除對開發(fā)人員的限制所有的職業(yè)都在持續(xù)的進(jìn)化。哪怕是爆炸和擁擠的印度招聘市場,全棧工程師在年也非常的搶手。印度的創(chuàng)業(yè)公司已經(jīng)開發(fā)意識到全棧工程師的重要意義,全棧會越來越重要。 在不斷壯大的招聘市場上,最需要的是有非常廣泛技術(shù)棧的人。 前言 敬愛的讀者,大家好。大家經(jīng)常討論的話題是作為一個軟件工程師是一個持續(xù)學(xué)習(xí)的過程。因為現(xiàn)有的趨勢和技術(shù)在軟件領(lǐng)域會很...

    selfimpr 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<