JS實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)

棧(stack)是一種常見的數(shù)據(jù)結(jié)構(gòu),它是遵循后進(jìn)先出的有序集合惕稻,(LIFO)蔗衡,生活中書桌上堆放的書本纤虽,餐桌上疊起來的盤子,都是典型的棧的形象绞惦。

使用JS來實(shí)現(xiàn)一個(gè)棧的數(shù)據(jù)結(jié)構(gòu)逼纸,可以基于數(shù)組開始。

class Stack {
  constructor() {
    this.items = [];
  }
}

棧的方法有

  • push(elements) 添加一個(gè)或者多個(gè)元素到棧頂
  • pop() 移除棧頂?shù)脑?/li>
  • peek() 返回棧頂?shù)脑丶貌酰?duì)棧不做修改
  • isEmpty() 棧為空返回true杰刽,否則返回false;
  • clear() 清空棧
  • size() 返回棧的元素個(gè)數(shù)

使用javascript的數(shù)組可以實(shí)現(xiàn)上述方法

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
}

使用數(shù)組來創(chuàng)建棧十分方便,但是數(shù)組屬于元素的有序集合王滤,為了保證有序贺嫂,占用的內(nèi)存空間也更多。
我們可以使用對(duì)象來再次創(chuàng)建一個(gè)棧雁乡,實(shí)現(xiàn)上述的方法第喳。

class Stack {
  constructor() {
    this.count = 0;
    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;
  }
  size() {
    return this.count;
  }
  isEmpty() {
    return this.count === 0;
  }
  peek() {
    if (this.isEmpty) {
      return undefined;
    }
    return this.items[this.count - 1];
  }
  clear() {
    this.count = 0;
    this.items = {};
  }
}

為了保護(hù)類內(nèi)部的數(shù)據(jù),可以設(shè)置下劃線命名踱稍,this._items,this._count;
或者使用symbol曲饱,或者weakMap,感興趣的友友們珠月,可以參考學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)和算法扩淀,這些文章的編寫也是對(duì)我平時(shí)閱讀這本書的一些總結(jié),個(gè)人練習(xí)輸出啤挎,這本書是寫的很不錯(cuò)的驻谆,解釋的很簡潔明確。

用棧解決問題的一個(gè)實(shí)例是侵浸,進(jìn)制轉(zhuǎn)換旺韭。
比如十進(jìn)制轉(zhuǎn)換二進(jìn)制。

function decimalToBinary(decNumber) {
  const stack = new Stack();
  let number = decNumber;
  let rem; // 余數(shù)
  let binaryNumber = '';
  while(number > 0) {
    rem = Math.floor(number % 2);
    stack.push(rem);
    number= Math.floor(number / 2);
  }
  while(!stack.isEmpty()) {
    binaryNumber += stack.pop().toString();
  }
  return binaryNumber;
}

擴(kuò)展到其他進(jìn)制轉(zhuǎn)換掏觉。

function baseConvert(decNumber, base) {
  const stack = new Stack();
  let number = decNumber;
  let rem;
  let baseString = '';
  const digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  if (!(base >= 2 && base <= 36)) {
    return '';
  }
  while(number > 0) {
    rem = Math.floor(number % base);
    stack.push(rem);
    number = Math.floor(number / base);
  }
  while(!stack.isEmpty()) {
    baseString += digits[stack.pop()];
  }
  return baseString;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末区端,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子澳腹,更是在濱河造成了極大的恐慌织盼,老刑警劉巖杨何,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沥邻,居然都是意外死亡危虱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門唐全,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埃跷,“玉大人,你說我怎么就攤上這事邮利∶直ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵延届,是天一觀的道長剪勿。 經(jīng)常有香客問我,道長方庭,這世上最難降的妖魔是什么厕吉? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮械念,結(jié)果婚禮上头朱,老公的妹妹穿的比我還像新娘。我一直安慰自己龄减,他們只是感情好髓窜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著欺殿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳖敷。 梳的紋絲不亂的頭發(fā)上脖苏,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音定踱,去河邊找鬼棍潘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛崖媚,可吹牛的內(nèi)容都是我干的亦歉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼畅哑,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼肴楷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荠呐,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赛蔫,失蹤者是張志新(化名)和其女友劉穎砂客,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呵恢,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞠值,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渗钉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彤恶。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鳄橘,靈堂內(nèi)的尸體忽然破棺而出声离,到底是詐尸還是另有隱情,我是刑警寧澤挥唠,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布抵恋,位于F島的核電站,受9級(jí)特大地震影響宝磨,放射性物質(zhì)發(fā)生泄漏弧关。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一唤锉、第九天 我趴在偏房一處隱蔽的房頂上張望世囊。 院中可真熱鬧,春花似錦窿祥、人聲如沸株憾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗤瞎。三九已至,卻和暖如春听系,著一層夾襖步出監(jiān)牢的瞬間贝奇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工靠胜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掉瞳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓浪漠,卻偏偏與公主長得像陕习,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子址愿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容