日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript数据结构与算法——栈详解

發布時間:2023/12/31 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript数据结构与算法——栈详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、棧基本知識

棧是一種特殊的列表,棧的元素只能通過列表的一端訪問,這一端成為棧頂,棧具有先進后出的特點,要想訪問棧底的元素,就必須將上邊的元素先拿出來。對棧的操作主要是入棧和出棧,通過push()和pop()實現。通過pop()還能預覽棧頂元素,但是返回元素時,會將該元素從棧中刪除,所以需要引入peek()方法,返回棧頂元素,而不會將其刪除。

2、JS中棧的實現

從棧的基本知識可以想到,要實現一個棧,需要有一個數據的存儲空間(這里使用數組)、push()方法、pop()方法、peek()方法,使用top變量記錄棧頂元素,以便peek()訪問。

實現棧構造函數

function Stack() {this.stack = []this.top = 0this.pop = popthis.push = pushthis.peek = peekthis.length = length // 用于返回棧元素數量this.clear = clear // 用于清空棧 }

push()

function push(param) {this.stack[this.top++] = param }

棧被壓進新元素后,top++,指向下一個空位置。

pop()

function pop() {return this.stack[--this.top] }

這里為什么是--this.top而不是this.top-- 呢,因為top初始是0,一個元素壓進棧后,top變成了1,而stack[1]對應的是第二個元素,此時只有一個元素,所以應該減1,以訪問棧頂元素(邏輯為先減后訪問)。

peek()

function peek() {return this.stack[this.top - 1] }

此方法用于返回棧頂元素。

length()

function length() {return this.top }

用于返回棧的元素個數。

clear()

function clear() {this.top = 0 }

此方法用于清空棧元素

測試實現的棧

測試用例

var stack = new Stack() stack.push('JavaScript') stack.push('TypeScript') stack.push('ActionScript') stack.push('CoffeeScript') console.log('棧的元素數量為: ' + stack.length()) console.log('棧頂元素為: ' + stack.peek()) console.log('進行一次出棧操作,出棧的元素為: ' + stack.pop()) console.log('出棧后棧的元素數量為: ' + stack.length()) console.log('此時棧頂元素為: ' + stack.peek())

測試結果

打開命令行工具,使用node執行該js文件,本人為:node stack.js
運行結果為:

3、棧應用舉例

3.1、回文問題

之前我們探討過回文問題的解決辦法,關于回文,不太清楚含義的可以先移步本人另這篇文章,簡單點說就是一個字符串反轉過來仍然是原來的字符順序,比如:“A man, a plan, a canal: Panama”,忽略大小寫,忽略標點符號。使用數據結合正則表達式的話,很容易解決。使用我們上邊建立的棧,應該如何實現呢?

function isPalindrome(str) {// 新建一個棧var stack = new Stack()// 使用正則表達式取出句子中的字母str = str.replace(/\W/g, '').toLowerCase();// 將所有字母入棧for (var i = 0; i < str.length; i++) {stack.push(str[i])}// 出棧操作, 拼接每次出棧的字母var reverse = ''while (stack.length() > 0) {reverse += stack.pop()}// 如果入棧順序和出棧順序一致, 則為回文結構if (str === reverse) {return true } else {return false} }

原理:棧為先進后出,進棧順序和出棧順序一致的話,兩個字符串必定相等,也就是正反順序相等,所以是回文結構,是不是有種恍然大悟的感覺,哈哈。

測試一下:

// test var str = 'Hello, JavaScript' if (isPalindrome(str)) {console.log(str + ' 是回文結構') } else {console.log(str + '不是回文結構') }var str1 = 'A man, a plan, a canal: Panama' if (isPalindrome(str1)) {console.log(str1 + ' 是回文結構') } else {console.log(str1 + '不是回文結構') }

node stack.js 得到以下結果,證明革命成功:

3.2、模擬遞歸

假設有個需求是求一個數字的階乘,可能大家很快就能想到以下方法:

// 遞歸問題 function factorial(num) {if (num === 0) {return 1} else {return num * factorial(num - 1)} } console.log(factorial(6))

使用棧的話,我們能模擬實現嗎?
5的階乘為5x4x3x2x1,那么我們把54321都推進棧里,然后在出棧時計算階乘應該就可以了吧?試試:

function stackFactorial(num) {var s = new Stack()while (num > 1) {s.push(num--)}var result = 1while (s.length() > 0) {result *= s.pop()}return result } console.log('stack result: ' + stackFactorial(6))

node stack.js 得到以下結果:

更多JS實現版數據結構與算法請留意本人后續博客,有錯誤歡迎指出O(∩_∩)O~

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的JavaScript数据结构与算法——栈详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。