JavaScript 棧的詳解及執行個體代碼,javascript執行個體

來源:互聯網
上載者:User

JavaScript 棧的詳解及執行個體代碼,javascript執行個體

JavaScript 棧

棧是一種遵從先進後出(LIFO)原則的有序集合。

新添加或待刪除的元素都儲存在棧的末尾,稱作棧頂,另一端就叫棧底。

在棧裡,新元素都靠近棧頂,舊元素都接近棧底

昨天因為有點事沒有更新,今天打算給大家講講JavaScript實現的資料結構

資料結構與演算法是程式語言的靈魂,是解決一切編程問題的基礎

以前學C/C++的時候,感覺演算法還是非常重要的,但是前端涉及的並不多

不管怎樣,作為技術人員,理解一些基本資料結構和演算法應該是必須的

而且我們的JavaScript實現資料結構和演算法更加容易

下面我們就先來看看其中一個最基本的

棧的理解

棧這種資料結構其實很好理解

可以把它想象成一個剛好能容下書大小的小箱子

推棧/壓棧就是把一本書書放在箱子中,但是只能放在箱子的最上面

彈棧/出棧就是從箱子中拿出一本書

棧頂是箱子中最頂上的書

棧底是箱子中對低下的書

生活中棧的例子比比皆是,比如堆放盤子,子彈夾推子彈等等

這可以協助我們更好的理解棧

棧也被用在我們程式設計語言的編譯器和記憶體中儲存變數、方法調用等等

棧的建立

那麼現在我們來用JavaScript實現一個棧

首先我們需要考慮一種資料結構來儲存棧元素,毫無疑問數組是合適的選擇

然後我們要實現棧的功能,同樣以裝書為例

  1. 向棧頂中添加元素(向箱子了扔一本書)
  2. 移除棧頂元素(從箱子中取出一本書)
  3. 查看棧頂元素(看看箱子裡最上面的書是什麼)
  4. 判斷棧是否為空白(看看箱子裡有沒有書)
  5. 移除棧內全部元素(把箱子裡的書全倒出來)
  6. 查看棧裡元素個數(查看箱子裡有幾本書)

毫無疑問如果箱子裡有很多書我們不能直接把箱子低下的書拿出來 所以我們不能直接操作棧底

也許我們有很多這樣的箱子,有很多棧 ,所以我們最好把它聲明為一個“類”,完整代碼如下

function Stack() {  var items = [];  this.push = function (ele) {    items.push(ele);  };//推棧  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());  };//列印棧}var stack = new Stack(); //聲明棧的執行個體

棧的應用

下面我們就用棧解決一些問題

比如把十進位轉化為二進位

要把十進位轉化為二進位,可以把這個數字和2整除,直到0為止

比如把50轉化為二進位就是10010

下面是演算法實現

function convertBinary(decNum) {  //十進位轉換為二進位  var remStack = new Stack(),    rem,    binaryStr = '';  while(decNum) {    rem = Math.floor(decNum % 2);    decNum = Math.floor(decNum / 2);    remStack.push(rem);   //餘數放到棧中  }  while(!remStack.isEmpty()) {    binaryStr += remStack.pop();  //利用pop把棧內元素逐一彈出,將餘數拼接成為一個字串  }  return binaryStr;}console.log(convertBinary(50));//輸出10010

還可以修改這個演算法,讓這個函數能夠把十進位轉化為任何進位

function baseConverter(decNum, base) { //十進位轉換為任意進位      var base = (base >= 2 && base <= 16) ? base : 10,    remStack = new Stack(),    rem,    baseStr = '',    digits = '0123456789ABCDEF';  while(decNum) {    rem = Math.floor(decNum % base);    decNum = Math.floor(decNum / base);    remStack.push(rem);   //餘數放到棧中  }  while(!remStack.isEmpty()) {    baseStr += digits[remStack.pop()]; //利用pop把棧內元素逐一彈出,將餘數拼接成為一個字串  }  return baseStr;}

其實用數組也可以實現,為了練習一下棧,就用棧來實現這個演算法

通過這個小應用我們可以簡單理解棧

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.