欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS表示Stack類練習(xí)用棧實現(xiàn)任意進制轉(zhuǎn)換

 更新時間:2023年04月25日 11:58:51   作者:顏醬  
這篇文章主要為大家介紹了JS表示Stack類練習(xí)用棧實現(xiàn)任意進制轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

基本概念

夯下數(shù)據(jù)結(jié)構(gòu)和算法基礎(chǔ),JS 里沒有棧、隊列、鏈表巴拉巴拉明顯的結(jié)構(gòu),只能用類去偽造,不然做算法題真的費勁。
先造最簡單的棧類吧,這邊底層使用數(shù)組,當(dāng)然有空的話,你也可以試試對象。

  • 棧是一種遵從后進先出(LIFO)原則的有序集合
  • 新添加或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底(類似,疊盤子)
  • 在棧里,新元素都靠近棧頂,舊元素都靠近棧底。

基本方法

  • push(i) 添加一個(或幾個)新元素到棧頂。
  • pop() 移除棧頂?shù)脑?,同時返回被移除的元素。
  • peek() 返回棧頂?shù)脑?,不對棧做任何修改(該方法不會移除棧頂?shù)脑兀瑑H僅返回它)。
  • isEmpty() 如果棧里沒有任何元素就返回 true,否則返回 false。
  • clear() 移除棧里的所有元素。
  • size() 返回棧里的元素個數(shù)。這個方法和數(shù)組的 length 屬性很類似。

類實現(xiàn)

class Stack {
  stack: any[];
  constructor() {
    this.stack = [];
  }
  size() {
    return this.stack.length;
  }
  peek() {
    return this.stack[this.stack.length - 1];
  }
  push(value: any) {
    this.stack.push(value);
  }
  pop() {
    return this.stack.pop();
  }
  isEmpty() {
    return this.size() === 0;
  }
  clear() {
    this.stack = [];
  }
}

可以頭上頂個注釋,就容易調(diào)用方法了

/**
 * 棧類
 * @class Stack
 * @description 棧是一種遵從后進先出(LIFO)原則的有序集合。
 * 新添加或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底。
 * 在棧里,新元素都靠近棧頂,舊元素都靠近棧底。
 * @property stack 棧內(nèi)部存儲的數(shù)組
 *
 * @method push(element(s)) 添加一個(或幾個)新元素到棧頂。
 * @method pop() 移除棧頂?shù)脑兀瑫r返回被移除的元素。
 * @method peek() 返回棧頂?shù)脑?,不對棧做任何修改(該方法不會移除棧頂?shù)脑?,僅僅返回它)。
 * @method isEmpty() 如果棧里沒有任何元素就返回 true,否則返回 false。
 * @method clear() 移除棧里的所有元素。
 * @method size() 返回棧里的元素個數(shù)。這個方法和數(shù)組的 length 屬性很類似。
 *
 * @example
 * const s = new Stack()
 * s.push(1)
 * s.push(2)
 * s.push(3)
 * s.pop() // 3
 * s.pop() // 2
 * s.pop() // 1
 * s.pop() // undefined
 * s.push(1)
 * s.push(2)
 * s.push(3)
 * s.peek() // 3
 * s.size() // 3
 * s.isEmpty() // false
 * s.clear()
 * s.isEmpty() // true
 * s.size() // 0
 *
 */

應(yīng)用場景

棧的應(yīng)用場景:瀏覽器的歷史記錄、存儲訪問過的任務(wù)、撤銷的操作等等。

練習(xí) 1:十進制數(shù)字轉(zhuǎn)化為二進制

十進制數(shù)字轉(zhuǎn)化為二進制的邏輯是:

關(guān)鍵邏輯:用十進制數(shù)除以 2,得到的余數(shù)存入棧中,得到的商(迭代)繼續(xù)除以 2, 得到的余數(shù)再繼續(xù)存入棧中(循環(huán)),直到商為 0 為止(終止條件)。

function toBinary(decNumber: number) {
  const s = new Stack();
  // 迭代指針,每次得到的商,初始是原始值
  let p = decNumber;
  // 商不為0 就一直循環(huán)
  while (p !== 0) {
    // 余數(shù)進棧
    s.push(p % 2);
    // 迭代
    p = Math.floor(p / 2);
  }
  let result = '';
  // 數(shù)字出棧,拼接,直至棧為空
  while (!s.isEmpty()) {
    result += s.pop();
  }
  return result;
}

加上注釋的話

/**
 * 十進制轉(zhuǎn)二進制
 * 1. 用十進制數(shù)除以 2,得到的余數(shù)存入棧中,得到的商繼續(xù)除以2 得到的余數(shù)繼續(xù)存入棧中,直到商為 0 為止。
 * @param {number} decNumber 十進制數(shù)
 * @returns {string} 二進制數(shù)
 * @example
 * toBinary(2) // '10'
 * toBinary(3) // '11'
 * toBinary(4) // '100'
 * toBinary(5) // '101'
 */

練習(xí) 2:十進制數(shù)字轉(zhuǎn)化為任意進制

轉(zhuǎn)化邏輯和上面的二進制大同小異,但這里有個限制,任意進制的范圍是 2-36,然后超過 10 就是ABCD....,注意下這里就行

function toBaseConverter(decNumber: number, base: number) {
  // 范圍限定
  if (base < 2 || base > 36) throw new Error('base must between 2 and 36');
  const s = new Stack();
  let p = decNumber;
  // 加了這行,超過10的表示
  const baseStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  while (p !== 0) {
    // s.push(p % 2) 換下,因為有字母,所以這樣寫法,沒有字母的話p % base就夠用
    s.push(baseStr[p % base]);
    // p = Math.floor(p / 2) 的2換成base
    p = Math.floor(p / base);
  }
  let result = '';
  while (!s.isEmpty()) {
    result += s.pop();
  }
  return result;
}

加上注釋的話

/**
 * 十進制轉(zhuǎn)任意進制
 * @param {number} decNumber 十進制數(shù)
 * @param {number} base 進制
 * @returns {string} 任意進制數(shù)
 * @example
 * toBaseConverter(20,5) // '40'
 * toBaseConverter(20,2) // '10100'
 * toBaseConverter(20,8) // '24'
 * toBaseConverter(20,16) // '14'
 * toBaseConverter(20,36) // 'E'
 * toBaseConverter(20,37) // Error: base must between 2 and 36
 */

引用

以上就是JS表示Stack類練習(xí)用棧實現(xiàn)任意進制轉(zhuǎn)換的詳細內(nèi)容,更多關(guān)于JS表示Stack類進制轉(zhuǎn)換的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 前端不使用i18n該如何優(yōu)雅的實現(xiàn)多語言

    前端不使用i18n該如何優(yōu)雅的實現(xiàn)多語言

    多語言的重要性相信不需要多言,下面這篇文章主要給大家介紹了關(guān)于前端不使用i18n該如何優(yōu)雅的實現(xiàn)多語言,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • JS實現(xiàn)圖文并茂的tab選項卡效果示例【附demo源碼下載】

    JS實現(xiàn)圖文并茂的tab選項卡效果示例【附demo源碼下載】

    這篇文章主要介紹了JS實現(xiàn)圖文并茂的tab選項卡效果,涉及javascript響應(yīng)鼠標(biāo)事件動態(tài)修改頁面元素屬性的相關(guān)操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2016-09-09
  • JavaScript中手動實現(xiàn)Array.prototype.map方法

    JavaScript中手動實現(xiàn)Array.prototype.map方法

    在前端開發(fā)中,我們經(jīng)常需要對數(shù)組進行操作和處理,本文主要介紹了JavaScript中手動實現(xiàn)Array.prototype.map方法,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • JS html時鐘制作代碼分享

    JS html時鐘制作代碼分享

    這篇文章主要為大家分享了JS html時鐘的制作代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • js實現(xiàn)簡潔的TAB滑動門效果代碼

    js實現(xiàn)簡潔的TAB滑動門效果代碼

    這篇文章主要介紹了js實現(xiàn)簡潔的TAB滑動門效果代碼,通過簡單的JavaScript自定義函數(shù)動態(tài)遍歷頁面元素實現(xiàn)tab滑動切換的功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • JavaScript ES6中export、import與export default的用法和區(qū)別

    JavaScript ES6中export、import與export default的用法和區(qū)別

    這篇文章主要給大家介紹了JavaScript ES6中export、import與export default的用法和區(qū)別,文中介紹的非常詳細,相信對大家學(xué)習(xí)ES6會有一定的幫助,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • JavaScript代碼性能優(yōu)化總結(jié)(推薦)

    JavaScript代碼性能優(yōu)化總結(jié)(推薦)

    下面小編就為大家?guī)硪黄狫avaScript代碼性能優(yōu)化總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-05-05
  • 原生JS和jQuery操作DOM對比總結(jié)

    原生JS和jQuery操作DOM對比總結(jié)

    這篇文章主要給大家介紹了原生JS和jQuery操作DOM的一些對比總結(jié),文中總結(jié)了很多的對比,相信對大家的學(xué)習(xí)或者工作能帶來一定的幫助,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 瘋掉了,盡然有js寫的操作系統(tǒng)

    瘋掉了,盡然有js寫的操作系統(tǒng)

    瘋掉了,盡然有js寫的操作系統(tǒng)...
    2007-04-04
  • JavaScript實現(xiàn)選項卡效果的分析及步驟

    JavaScript實現(xiàn)選項卡效果的分析及步驟

    這篇文章主要給大家介紹了關(guān)于JavaScript實現(xiàn)選項卡效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論