JavaScript中的棧和佇列應用

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第18天,點選檢視活動詳情

什麼是棧和佇列

棧如果用陣列模擬的話是類似於一個U形桶狀堆疊空間,地下是封口的,只能從頂部一個地方進出,它的進出都是有順序的,看下圖:如果是進入,則是最下是最先進入的,如果要出,則是從最頂部先出

無標題.png

和佇列來對比,只是資料結構相同,佇列是一側進一側出,做任務佇列排程的時候都是先入先出

無標題.png

什麼時候用到棧

從編輯器開發寫程式碼的時候,如果程式碼的中的括號寫錯了,則很容易判定出那個地方少了括號,在JavaScript語法中有可以設定大括號{}、中括號:[]、小括號:()、引號:""等可以判定的規則, 可以發現它是有一些規則的,可以通過兩側是否對稱來進行判斷,如果不對稱則提示錯誤 function (b){ let a = [] let obj = {"(":")","[":"]","{":"}"} for(let i = 0;i<b.length;i++ ){ const last = b[i] if(last in obj){ a.push(ele) }else{ if(ele!= obj[stack.pop]){ return false } } } return !a.length } 思路:它在棧中首先通過遍歷把陣列的每一位放到棧中,如果發現放入棧中有相同的字元則把它兩個同時推出,在程式碼中,迴圈遍歷物件如果傳入的物件在Obj中有的話,則繼續,如果沒有停止遍歷

目錄的計算

Nodejs中經常碰到目錄的處理,比如webpack,目標是把當前的相對路徑轉換為絕對路徑,/a/b/../c./b,這種格式,pathResult,把傳入的字串通過/拆分成陣列,並判定它是否為空或者是是否相對路徑,並把它拆分並放到陣列 function (path){ var pathArr = path.split('/') var newPath = [] arr.forEach(temp=>{ if(temp == '' || temp == '.'){ return }else if(item == '..'){ if(newPath.length){ newPath.pop() }else{ return } }else{ newPath.push(item) } }) } 它在棧中的應用是把每個對應的路徑名傳入到棧中,如果碰到相對路徑則,轉換為絕對路徑,最後在返回出 最後把該陣列,通過/拆分成字串 return "/"+newPath.join('/')