亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

每周一練 之 數據結構與算法(Stack)

2024-05-06 16:49:58
字體:
來源:轉載
供稿:網友

最近公司內部在開始做前端技術的技術分享,每周一個主題的 每周一練,以基礎知識為主,感覺挺棒的,跟著團隊的大佬們學習和復習一些知識,新人也可以多學習一些知識,也把團隊內部學習氛圍營造起來。

我接下來會開始把每周一練的題目和知識整理一下,便于思考和鞏固,就像今天這篇開始。

學習的道路,很漫長,要堅持,希望大家都能掌握自己喜歡的技術,和自己需要的技術。

本周練習內容:數據結構算法 —— Stack

這些都是數據結構與算法,一部分方法是團隊其他成員實現的,一部分我自己做的,有什么其他實現方法或錯誤,歡迎各位大佬指點,感謝。

一、棧有什么特點,生活中有什么例子?

  1. 棧( stack )又稱堆棧,是一種后進先出的有序集合,其中一端為棧頂,另一端為棧底,添加元素(稱為壓棧/入?;蜻M棧)時,將新元素壓入棧頂,刪除元素(稱為出棧或退棧)時,將棧底元素刪除并返回被刪除元素。
  2. 特點:先進后出,后進先出。
  3. 例子:一疊書、一疊盤子。

 數據結構,算法,Stack

二、實現一個棧,并實現下面方法

  1. push(element):添加一個新元素到棧頂。
  2. pop():移除棧頂的元素,同時返回被移除的元素。
  3. peek():返回棧頂的元素,不對棧做任何修改 (這個方法不會移除棧頂的元素,僅僅返回它)。
  4. isEmpty():如果棧沒有任何元素就返回 true,否則返回 false。
  5. clear():移除棧里面的所有元素。
  6. size():返回棧里的元素個數。這個方法與數組的 length 屬性類似。

方法1:ES6實現

class Stack {  constructor (){    this.items = []  }  push( element ){    this.items.push(element)  }  pop(){    return this.items.pop()  }  peek(){    return this.items[this.items.length - 1]  }  isEmpty(){    return this.items.length === 0  }  clear(){    this.items = []  }  size(){    return this.items.length  }}

上面實現的方式雖然簡單,但是內部 items 屬性是公共的,為了滿足面向對象變成私有性的原則,我們應該讓 items 作為私有屬性,因此我們可以使用 ES6 中 Symbol 或 WeakMap 來實現:

方法2:使用 ES6 的 Symbol 基本數據類型實現
知識點復習:ES6 中的 Symbol 介紹

const _items = Symbol()class Stack {  constructor (){    this[_items] = []  }  push (element){    this[_items].push(element)  }  // 剩下方法和第一種實現的差不多,這里省略  // 只要把前面方法中的 this.items 更改為 this[_items]}

 方法3:使用 ES6 的 WeakMap 實現

知識點復習:ES6 中的 WeakMap 介紹

 

const items = new WeakMap()class Stack {  constructor (){    items.set(this, [])  }  push (element){    let item = items.get(this)    item.push(element)  }  // 剩下方法和第一種實現的差不多,這里省略  // 只要把前面方法中的獲取 this.items 的方式,更改為 items.get(this) 獲取}

 三、編寫一個函數,實現十進制轉二進制

題目意思很簡單,就是十進制轉二進制,但是在實際工作開發中,我們更愿意實現的是任意進制轉任意進制,不過呢,我們還是以解決問題為首要目標呀。

當然,業務需求可以直接使用 toString(2) 方法,但是為了練習,咱還是不這么用咯。

方法1:使用前面定義的 Stack 類

這里使用前面題目中定義的 Stack 類。

/** * 十進制轉換為二進制 * @param {Number} bit  */function bitset (bit){  if(bit == 0) return '0'  if(!/^[0-9]+.?[0-9]*$/.test(bit)){    return new Error('請輸入正確的數值!')  }  let stack = new Stack(), result = ''  while (bit > 0){    stack.push(bit % 2)    bit = Math.floor(bit / 2)  }  while (!stack.isEmpty()){    result += stack.pop().toString()  }  return result}

方法2:簡單實現

下面這個方法,其實不太好,因為沒有怎么用到這次要練習的棧方法,哈哈。

/** * 十進制轉換為二進制 * @param {Number} bit  */function bitset (bit){  if(bit == 0) return '0'  if(!/^[0-9]+.?[0-9]*$/.test(bit)){    return new Error('請輸入正確的數值!')  }  let arr = []  while(bit > 0){    arr.push(bit % 2)    bit = Math.floor(bit / 2)  }  return arr.reverse().join('')}

另外可以參考:wikiHow - 從十進制轉換為二進制。

四、編寫一個函數,實現檢驗圓括號順序的有效性

主要目的就是:該函數接收一個圓括號字符串,判斷里面的括號順序是否有效,如果有效則返回 true 反之 false。
如:

  1. (   -> false
  2. ()  -> true
  3. (() -> false
  4. ()) -> false
  5. ()) -> false
  6. (((()()))()) -> true

這個題目實現的主要方法是:遍歷字符串,先排除錯誤情況,然后將 ( 入棧保存,將 ) 入棧匹配前一個元素是否是 ( ,如果是,則 pop() 前一個元素 (,如果不是,則 push() 這個 ) 入棧,最終查看棧是否為空,若是則檢驗成功,否則失敗。

方法1:使用前面定義的 Stack 類

這里使用前面題目中定義的 Stack 類。

/** * 檢驗圓括號順序的有效性 * @param {String} str  */function validParentheses (str){  if(!str || str.length === 0 || str[0] === ')') return false  let stack = new Stack()  str.split('').forEach(char => {    let status = stack.peek() === '(' && char === ')'    status ? stack.pop() : stack.push(char)  })  return stack.isEmpty()}

方法2:出入棧操作

/** * 檢驗圓括號順序的有效性 * @param {String} str  */function validParentheses (str){  if(!str || str.length === 0 || str[0] === ')') return false  let arr = []  for(let i = 0; i < str.length ; i++){    str[i] === '(' ? arr.push(str[i]) : arr.pop()  }  return arr.length === 0}

五、改造題二,添加一個 min 函數來獲得棧中最小元素

 

步驟 數據棧 輔助棧 最小值
1.push 3 3 0 3
2.push 4 3, 4 0, 0 3
3.push 2 3, 4, 2 0, 0, 2 2
4.push 1 3, 4, 2 ,1 0, 0, 2, 3 1
5.pop 3, 4, 2 0, 0, 2 2
6.pop 3, 4 0, 0 3
7.push 3, 4 ,0 0, 0, 2 0

 

使用示例如下:

let stack = new Stack();stack.push(3);console.log('After push 3, Min item is', stack.min());stack.push(4);console.log('After push 4, Min item is', stack.min());stack.push(2);console.log('After push 2, Min item is', stack.min());stack.push(1);console.log('After push 1, Min item is', stack.min());stack.pop();console.log('After pop, Min item is', stack.min());stack.pop();console.log('After pop, Min item is', stack.min());stack.push(0);console.log('After push 0, Min item is', stack.min());

提示:利用輔助棧(Web 端可利用數組),每次對棧 push/pop 元素時,也同時更新輔助棧(存儲最小元素的位置)

方法1:小操作

class Stack { constructor() {  this.items = [];  this.minIndexStack = []; } push(element) {  this.items.push(element);  let minLen = this.minIndexStack.length;  let minItemIndex = this.minIndexStack[minLen - 1];  if(minLen === 0 || this.items[minItemIndex] > item) {   this.minIndexStack.push(this.items.length - 1);  } else {   this.minIndexStack.push(minItemIndex);  } } pop() {  this.minIndexStack.pop();  return this.items.pop(); }  min() {  let len = this.minIndexStack.length;  return (len > 0 && this.items[this.minIndexStack[len - 1]]) || 0; } peek() {  return this.items[this.items.length - 1]; }  // 省略其它方法}

方法2:與方法1中push實現的差異

class Stack {  constructor (){    this.items = [] // 數據棧    this.arr = []  // 輔助棧  }  push( element ){    this.items.push(element)    let min = Math.min(...this.items)    this.arr.push( min === element ? this.size() - 1 : 0)  }  pop(){    this.arr.pop()    return this.items.pop()  }  peek(){    return this.items[this.items.length - 1]  }  isEmpty(){    return this.items.length === 1  }  clear(){    this.items = []  }  size(){    return this.items.length  }  min (){    let last = this.arr[this.arr.length - 1]    return this.items[last]  }}

以上所述是小編給大家介紹的數據結構與算法(Stack)詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩视频免费中文字幕| 中文字幕最新精品| 91免费版网站入口| 日韩在线观看你懂的| 精品视频在线导航| 热久久这里只有精品| 国产精品自拍网| 97超级碰碰碰| 国产成人精品电影| 国内精品在线一区| 亚洲欧美日韩另类| 色婷婷av一区二区三区久久| 成人免费视频97| 国产成人一区二区在线| 欧美激情2020午夜免费观看| 成人免费网视频| 国内成人精品一区| 九九视频直播综合网| 欲色天天网综合久久| 青青草一区二区| 国产综合视频在线观看| 欧美国产极速在线| 98午夜经典影视| 亚洲字幕在线观看| 久久99精品国产99久久6尤物| 久久久久久久久久久国产| 亚洲最大av网| 日韩视频亚洲视频| 亚洲成年网站在线观看| 亚洲毛片在线看| 亚洲国产成人精品一区二区| 国产精品夜间视频香蕉| 亚洲综合在线做性| 美日韩精品视频免费看| 欧美乱大交xxxxx另类电影| wwwwwwww亚洲| 国产精品久久久久久超碰| 亚洲黄一区二区| 日韩大陆欧美高清视频区| 欧美国产第二页| 亚洲免费视频观看| 亚洲欧美三级伦理| 国产精品一区二区av影院萌芽| 亚洲性视频网址| 一本一道久久a久久精品逆3p| 最新的欧美黄色| 欧美另类老肥妇| 亚洲第一男人av| 日韩电影第一页| 欧美高跟鞋交xxxxxhd| 91亚洲国产成人精品性色| 一区二区三区精品99久久| 日韩亚洲在线观看| 国产在线精品成人一区二区三区| 国产精品免费福利| 国产福利视频一区二区| 精品国产一区二区三区四区在线观看| 日韩一区二区三区在线播放| 日本韩国在线不卡| 亚洲第一天堂av| 久久精品99久久久香蕉| 久久综合久久美利坚合众国| 国产成人精彩在线视频九色| 欧亚精品中文字幕| 中文字幕日韩综合av| 国产日韩精品在线播放| 国内免费精品永久在线视频| 九九久久精品一区| 伦伦影院午夜日韩欧美限制| 国产在线日韩在线| 亚洲欧美日韩国产中文专区| 久久免费视频观看| 国产精品香蕉国产| 欧美韩国理论所午夜片917电影| 久久国产精品网站| 国产一区二区三区在线播放免费观看| 亚洲精品白浆高清久久久久久| 欧美日韩亚洲激情| 免费不卡欧美自拍视频| 国产精品欧美日韩久久| 亚洲国产精久久久久久久| 欧美大片免费观看在线观看网站推荐| 欧美日韩中文字幕在线| 精品调教chinesegay| 精品中文字幕视频| 国产香蕉97碰碰久久人人| 亚洲国产私拍精品国模在线观看| 久久这里有精品| 日韩欧美高清视频| 久久久91精品国产| 亚洲xxxx妇黄裸体| 国内精品国产三级国产在线专| 精品中文字幕在线观看| 97热精品视频官网| 国产精品27p| 性金发美女69hd大尺寸| 国产欧亚日韩视频| 亚洲美女免费精品视频在线观看| 97婷婷大伊香蕉精品视频| 97avcom| 午夜精品一区二区三区av| 午夜精品久久久久久99热| 成人激情综合网| 亚洲午夜国产成人av电影男同| 国产精品久久久久99| 久久久久亚洲精品| 欧美在线亚洲在线| 亚洲加勒比久久88色综合| 精品少妇一区二区30p| 亚洲网站视频福利| 亚洲网站视频福利| 亚洲男人天堂2024| 亚洲jizzjizz日本少妇| 亚洲第一中文字幕| 精品国产福利在线| 久久国产精品网站| 久久久极品av| 欧美成人激情图片网| 亚洲aⅴ男人的天堂在线观看| 亚洲有声小说3d| 国产精品免费一区二区三区都可以| 日韩av免费在线看| 亚洲欧美成人在线| 亚洲第一av网站| 亚洲成年人在线| 亚洲成人在线网| 亚洲乱码一区av黑人高潮| 精品国产成人av| 欧美成人一二三| 欧美另类69精品久久久久9999| 欧美中文字幕视频| 亚洲一区二区三区视频| www.日本久久久久com.| 久久人人爽人人爽人人片亚洲| 91tv亚洲精品香蕉国产一区7ujn| 欧美精品生活片| 一区二区福利视频| 亚洲的天堂在线中文字幕| 精品久久久久久久久国产字幕| 国产精品美乳一区二区免费| 久久成人这里只有精品| 日韩中文字幕国产精品| 国产999精品视频| 欧美大尺度电影在线观看| 久久精品电影网| 97超碰色婷婷| 欧美怡春院一区二区三区| 国产精品久久久亚洲| 日韩中文在线观看| 久操成人在线视频| 色无极亚洲影院| 尤物九九久久国产精品的特点| 欧美精品videos性欧美| 国产香蕉一区二区三区在线视频| 日韩一区二区精品视频| www.欧美精品一二三区| 日韩av高清不卡| 欧美精品做受xxx性少妇| 日韩动漫免费观看电视剧高清| 少妇高潮久久久久久潘金莲| 精品国产老师黑色丝袜高跟鞋| 尤物99国产成人精品视频| 中文字幕欧美亚洲| 久久久久国色av免费观看性色|