棧是一種遵循 後進先出(LIFO) 原則的有序集合。新添加的或者待刪除的元素都保存在棧的尾部(即棧頂),另外一端叫棧底。在棧裏,新元素都靠近棧頂,舊元素都接近棧底。git
方法一是建立一個Stack類來表示棧。具體代碼以下:數組
function Stack() { var items = []; // 添加一個(或幾個)新元素到棧頂 this.push = function(ele) { items.push(ele); }; // 移除棧頂的元素,同時返回被移除的元素 this.pop = function() { return items.pop(); }; // 返回棧頂的元素,不對棧作任何修改 this.peek = function() { return items[items.length - 1]; }; // 判斷棧裏使是否還有元素 this.isEmpty = function() { return items.length == 0; }; // 移除棧裏全部的元素 this.clear = function() { items = []; }; // 返回棧裏的元素個數 this.size = function() { return items.length; }; this.print = function() { console.log(items.toString()); }; } var stack = new Stack(); console.log(stack.isEmpty()); stack.push(1); stack.push(8); console.log(stack.peek()); stack.push(10); console.log(stack.peek()); console.log(stack.size()); console.log(stack.isEmpty()); console.log(14) stack.pop(); stack.pop(); stack.print();
另外一種方式就是經過push將元素推入棧頂,而後遍歷棧裏的內容,刪除棧頂元素,由於在棧頂元素被刪除的時候,數組的長度是一直在變化的,因此要先將數組的長度賦值給len,來確保每次刪除的是棧頂元素this
function stack2 () { var arr = [] for(let i = 0; i < 5; i ++){ var temp = i + 1; arr.push(temp) console.log(temp + '入棧') console.log(arr) } console.log("arr內容:" + arr) var len = arr.length for(let i = 0; i < len; i++) { console.log("當前棧的長度:" + arr.length) console.log("刪除棧頂元素:" + arr.pop()) } } stack2()
棧的實際應用之一就是實現十進制轉化爲任意進制
以十進制轉化爲二進制爲例:要把十進制轉化成二進制,咱們能夠將十進制數字和2整除(二進制是蠻二進一),直到結果是0爲止。其轉化過程大體以下:code
// 將十進制轉爲任意進制 function baseConerter(decNumber, base){ var remStack = new Stack(), rem, baseString = '', digits = '0123456789ABCDEF' while (decNumber > 0) { rem = Math.floor(decNumber % base) remStack.push(rem) decNumber = Math.floor(decNumber / base) } while (!remStack.isEmpty()){ baseString += digits[remStack.pop()] } console.log('baseString:' + baseString) return baseString } baseConerter(223411, 2) // 110110100010110011 baseConerter(223411, 8) // 664263 baseConerter(223411, 16) // 368B3