您好,登錄后才能下訂單哦!
這篇文章主要講解了“JS表示Stack類怎么用棧實現任意進制轉換”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JS表示Stack類怎么用棧實現任意進制轉換”吧!
夯下數據結構和算法基礎,JS 里沒有棧、隊列、鏈表巴拉巴拉明顯的結構,只能用類去偽造,不然做算法題真的費勁。
先造最簡單的棧類吧,這邊底層使用數組,當然有空的話,你也可以試試對象。
棧是一種遵從后進先出(LIFO)原則的有序集合
新添加或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底(類似,疊盤子)
在棧里,新元素都靠近棧頂,舊元素都靠近棧底。
push(i) 添加一個(或幾個)新元素到棧頂。
pop() 移除棧頂的元素,同時返回被移除的元素。
peek() 返回棧頂的元素,不對棧做任何修改(該方法不會移除棧頂的元素,僅僅返回它)。
isEmpty() 如果棧里沒有任何元素就返回 true,否則返回 false。
clear() 移除棧里的所有元素。
size() 返回棧里的元素個數。這個方法和數組的 length 屬性很類似。
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 = []; } }
可以頭上頂個注釋,就容易調用方法了
/** * 棧類 * @class Stack * @description 棧是一種遵從后進先出(LIFO)原則的有序集合。 * 新添加或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底。 * 在棧里,新元素都靠近棧頂,舊元素都靠近棧底。 * @property stack 棧內部存儲的數組 * * @method push(element(s)) 添加一個(或幾個)新元素到棧頂。 * @method pop() 移除棧頂的元素,同時返回被移除的元素。 * @method peek() 返回棧頂的元素,不對棧做任何修改(該方法不會移除棧頂的元素,僅僅返回它)。 * @method isEmpty() 如果棧里沒有任何元素就返回 true,否則返回 false。 * @method clear() 移除棧里的所有元素。 * @method size() 返回棧里的元素個數。這個方法和數組的 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 * */
棧的應用場景:瀏覽器的歷史記錄、存儲訪問過的任務、撤銷的操作等等。
十進制數字轉化為二進制的邏輯是:
關鍵邏輯:用十進制數除以 2,得到的余數存入棧中,得到的商(迭代)繼續除以 2, 得到的余數再繼續存入棧中(循環),直到商為 0 為止(終止條件)。
function toBinary(decNumber: number) { const s = new Stack(); // 迭代指針,每次得到的商,初始是原始值 let p = decNumber; // 商不為0 就一直循環 while (p !== 0) { // 余數進棧 s.push(p % 2); // 迭代 p = Math.floor(p / 2); } let result = ''; // 數字出棧,拼接,直至棧為空 while (!s.isEmpty()) { result += s.pop(); } return result; }
加上注釋的話
/** * 十進制轉二進制 * 1. 用十進制數除以 2,得到的余數存入棧中,得到的商繼續除以2 得到的余數繼續存入棧中,直到商為 0 為止。 * @param {number} decNumber 十進制數 * @returns {string} 二進制數 * @example * toBinary(2) // '10' * toBinary(3) // '11' * toBinary(4) // '100' * toBinary(5) // '101' */
轉化邏輯和上面的二進制大同小異,但這里有個限制,任意進制的范圍是 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; }
加上注釋的話
/** * 十進制轉任意進制 * @param {number} decNumber 十進制數 * @param {number} base 進制 * @returns {string} 任意進制數 * @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類怎么用棧實現任意進制轉換”的內容了,經過本文的學習后,相信大家對JS表示Stack類怎么用棧實現任意進制轉換這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。