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

資訊專欄INFORMATION COLUMN

Javascript數(shù)據(jù)結(jié)構(gòu)與算法(三)棧

kohoh_ / 1336人閱讀

摘要:保護(hù)數(shù)據(jù)結(jié)構(gòu)內(nèi)部元素下劃線命名約定這只是一種約定,只能依賴于開發(fā)人員具備的常識(shí)用的限定作用于實(shí)現(xiàn)類實(shí)現(xiàn)了假的私有屬性,雖然基本類型不可變,但由于新增的方法仍然能取到所有屬性,而且是數(shù)組的形式,但我們操作的是棧,不應(yīng)該出現(xiàn)這種行為。

棧是一種遵循后進(jìn)先出(ILFO)原則的有序集合,新添加或待刪除的元素都保存在棧的同一段,稱為棧頂,另一端就叫棧底?,F(xiàn)實(shí)中很多例子采用了這種數(shù)據(jù)結(jié)構(gòu),比如一摞書,疊放的盤子。棧通常用來保存變量、方法調(diào)用,當(dāng)然也可以用于瀏覽器歷史記錄。

基于數(shù)組的棧 創(chuàng)建類
class StackArray {
  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 = [];
  }
轉(zhuǎn)化為數(shù)組
toArray() {
    return this.items;
  }
轉(zhuǎn)化為字符串
toString() {
    return this.items.toString();
  }
基于Javascript對(duì)象的stack類 創(chuàng)建stack類
class Stack {
  constructor() {
    this.count = 0;//記錄棧的大小,幫助我們進(jìn)行添加和刪除操作
    this.items = {};
  }
添加元素
push(element) {
    this.items[this.count] = element;
    this.count++;
  }
刪除元素
pop() {
    if (this.isEmpty()) {
      return undefined;
    }
    this.count--;
    const result = this.items[this.count];
    delete this.items[this.count];
    return result;
  }
驗(yàn)證一個(gè)棧是否為空和它的大小
isEmpty() {
    return this.count === 0;
  }

  size() {
    return this.count;
  }
查看棧頂?shù)闹挡G蹇?/b>
peek() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items[this.count - 1];
  };
clear() {
    /* while (!this.isEmpty()) {
        this.pop();
      } */
    this.items = {};
    this.count = 0;
  };
轉(zhuǎn)為字符串
toString() {
    if (this.isEmpty()) {
      return "";
    }
    let objString = `${this.items[0]}`;
    for (let i = 1; i < this.count; i++) {
      objString = `${objString},${this.items[i]}`;
    }
    return objString;
  }
}
總結(jié)

除了toString方法,我們創(chuàng)建的其他方法的時(shí)間復(fù)雜度均是O(1),代表我們可以直接扎到目標(biāo)元素并對(duì)其進(jìn)行操作。

注意

目前為止我們使用的是ES6語法類,由于JavaScript語言的特點(diǎn),類并不能跟其他語言一樣具有私有屬性,也就是在外部可以引用私有屬性,對(duì)其進(jìn)行賦值等操作??匆韵碌拇a了解一下:

const stack = new Stack();
console.log(Object.getOwnPropertyNames(stack));//["count","items"]
console.log(Object.keys(stack));//["count","items"]
console.log(stack.items);//直接訪問私有屬性

那么問題來了,我們只想讓用戶使用我們暴露出來的屬性或者方法,我們?cè)撛趺磳?shí)現(xiàn)私有屬性呢。筆者看了前輩總結(jié)的,直接把它寫上來。

保護(hù)數(shù)據(jù)結(jié)構(gòu)內(nèi)部元素 下劃線命名約定
class stack{
    constructor(){
        this._count = 0;
        this._items = {};
    }
};

這只是一種約定,只能依賴于開發(fā)人員具備的常識(shí)

用E2015的限定作用于Symbol實(shí)現(xiàn)類
const _items = Symbol("stackItems");
class Stack{
    constructor(){
        this[_items] = [];
    }
};

實(shí)現(xiàn)了假的私有屬性,雖然Symbol基本類型不可變,但由于ES2015新增的Object.getOwnPropertySymbols方法仍然能取到所有Symbol屬性,而且是數(shù)組的形式,但我們操作的是棧,不應(yīng)該出現(xiàn)這種行為。別急,還有第三個(gè)方案

用ES2015的WeakMap實(shí)現(xiàn)類
const items = new WeakMap();
class Stack{
    constructor(){
        items.set(this,[]);
    },
    push(element){
        const s = items.get(this);
        s.push(element);
    }
}

這樣我們就實(shí)現(xiàn)了一個(gè)實(shí)現(xiàn)了一個(gè)完全的私有屬性 ,但是代碼可讀性對(duì)于筆者真的太難受了,不知道你們?cè)趺从X得呢。

棧的實(shí)踐 進(jìn)制轉(zhuǎn)換算法
function baseConverter(decNumber, base) {
  const remStack = new Stack();
  const digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  let number = decNumber;
  let rem;
  let baseString = "";

  if (!(base >= 2 && base <= 36)) {
    return "";
  }

  while (number > 0) {
    rem = Math.floor(number % base);
    remStack.push(rem);
    number = Math.floor(number / base);
  }

  while (!remStack.isEmpty()) {
    baseString += digits[remStack.pop()];
  }
平衡圓括號(hào)算法
function parenthesesChecker(symbols) {
  
const stack = new Stack();
  const opens = "([{";
  const closers = ")]}";
  let balanced = true;
  let index = 0;
  let symbol;
  let top;

  while (index < symbols.length && balanced) {
    symbol = symbols[index];
    if (opens.indexOf(symbol) >= 0) {
      stack.push(symbol);
    } else if (stack.isEmpty()) {
      balanced = false;
    } else {
      top = stack.pop();
      if (!(opens.indexOf(top) === closers.indexOf(symbol))) {
        balanced = false;
      }
    }
    index++;
  }
  return balanced && stack.isEmpty();
}

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

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

相關(guān)文章

  • 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)算法(一):隊(duì)列

    摘要:之?dāng)?shù)組操作接下來就是數(shù)據(jù)結(jié)構(gòu)的第一部分,棧。以字符串顯示棧中所有內(nèi)容方法的實(shí)現(xiàn)說明需要往棧中添加新元素,元素位置在隊(duì)列的末尾。的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,棧與隊(duì)列 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(三):集合第...

    Flink_China 評(píng)論0 收藏0
  • CSS技巧 - 收藏集 - 掘金

    摘要:筆者作為一位,將工作以來用到的各種優(yōu)秀資料神器及框架整理在此,畢竟好記性不如爛鍵盤,此前端知識(shí)點(diǎn)大百科全書前端掘金,,不定期更新技巧前端掘金技巧,偶爾更新。計(jì)算數(shù)組的極值技巧使你的更加專業(yè)前端掘金一個(gè)幫你提升技巧的收藏集。 CSS 樣式畫各種圖形 - 前端 - 掘金下面是一些我在 CSS 中經(jīng)常用到的圖案,還有一些是在css-tricks看到的。記錄一下,以后會(huì)用到。會(huì)持續(xù)更新… 一、...

    Jonathan Shieber 評(píng)論0 收藏0
  • CSS技巧 - 收藏集 - 掘金

    摘要:筆者作為一位,將工作以來用到的各種優(yōu)秀資料神器及框架整理在此,畢竟好記性不如爛鍵盤,此前端知識(shí)點(diǎn)大百科全書前端掘金,,不定期更新技巧前端掘金技巧,偶爾更新。計(jì)算數(shù)組的極值技巧使你的更加專業(yè)前端掘金一個(gè)幫你提升技巧的收藏集。 CSS 樣式畫各種圖形 - 前端 - 掘金下面是一些我在 CSS 中經(jīng)常用到的圖案,還有一些是在css-tricks看到的。記錄一下,以后會(huì)用到。會(huì)持續(xù)更新… 一、...

    SHERlocked93 評(píng)論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)算法之美 - 內(nèi)存堆內(nèi)存 、淺拷貝深拷貝

    摘要:棧內(nèi)存與堆內(nèi)存淺拷貝與深拷貝,可以說是前端程序員的內(nèi)功,要知其然,知其所以然。棧內(nèi)存與堆內(nèi)存中的變量分為基本類型和引用類型。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 前言 想寫好前端,先練好內(nèi)功。 棧內(nèi)存與堆內(nèi)存 、淺拷貝與深拷貝,可以說是前端程序員的內(nèi)功,要知其然,知其所以然。 筆者寫的 JavaScrip...

    dailybird 評(píng)論0 收藏0
  • [ JavaScript ] 數(shù)據(jù)結(jié)構(gòu)算法 ——

    摘要:而且目前大部分編程語言的高級(jí)應(yīng)用都會(huì)用到數(shù)據(jù)結(jié)構(gòu)與算法以及設(shè)計(jì)模式。新添加的或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底。在棧里,新元素都靠近棧頂,舊元素都接近棧底。 前言 JavaScript是當(dāng)下最流行的編程語言之一,它可以做很多事情: 數(shù)據(jù)可視化(D3.js,Three.js,Chart.js); 移動(dòng)端應(yīng)用(React Native,Weex,AppCan,Fl...

    everfight 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<