㈠什么是棧?
⑴棧,英文 Last In First Out 簡稱 LIFO,遵從后進先出的原則,與 “隊列” 相反,在棧的頭部添加元素、刪除元素,如果棧中沒有元素就稱為空棧。
⑵是一種連續儲存的數據結構,具有先進后出的性質。通常的操作有入棧(壓棧),出棧和棧頂元素。想要讀取棧中的某個元素,就是將其之間的所有元素出棧才能完成。
㈡棧的運行機制
⑴Constructor(capacity): 初始化棧內存空間,設定棧的容量
⑵isEmpty(): 檢查棧是否為空,是否有元素
⑶isOverflow(): 檢查棧空間是否已滿,如果滿了是不能在入棧的
⑷enStack(element): 棧頂位置入棧,先判斷棧是否已滿
⑸deStack(): 棧頂位置出棧,先判斷棧元素是否為空
⑹len(): 棧空間已有元素長度
⑺clear(): 清空棧元素,內存空間還是保留的
⑻destroy(): 銷毀棧,同時內存也要回收(通常高級語言都會有自動回收機制,例如 C 語言這時就需要手動回收)
⑼traversing(): 遍歷輸出棧元素
㈢測試
const s1 = new StackStudy(4); s1.enStack('Nodejs'); // 入棧 s1.enStack('技'); s1.enStack('術'); s1.enStack('棧'); s1.traversing() // 棧 | 術 | 技 | Nodejs console.log(s1.deStack()); // 出棧 -> 棧 s1.traversing() // 術 | 技 | Nodejs s1.traversing(true) // 從棧底遍歷:Nodejs | 技 | 術
下面通過一張圖展示以上程序的入棧、出棧過程:
㈣JavaScript 數組實現棧
⑴基於 JS 數組的入棧、出棧過程實現:
⑵采用 JavaScript 原型鏈的方式實現:
function StackStudy(elements) { this.elements = elements || []; }//初始化隊列:初始化一個存儲棧元素的數據結構,如果未傳入默認賦值空數組 StackStudy.prototype.enStack = function(element) { this.elements.push(element); }//添加棧元素:實現一個 enStack 方法,向棧添加元素,注意只能是棧頭添加 StackStudy.prototype.deStack = function() { return this.elements.pop(); }//移除棧元素:實現一個 deStack 方法,棧尾部彈出元素 StackStudy.prototype.print = function() { console.log(this.elements.toString()); } const stack = new StackStudy(['a', 'b']); stack.enStack('c'); stack.print() stack.deStack('c'); stack.print();
㈤棧方法
⑴ECMAScript 數組也提供了一種讓數組的行為類似於其他數據結構的方法。
具體說來,數組可以表現得就像棧一樣,后者是一種可以限制插入和刪除項的數據結構。
棧是一種 LIFO(Last-In-First-Out, 后進先出)的數據結構,也就是新添加的項早被移除。
而棧中項的插入(叫做推入)和移除(叫做彈出),只發生在一個位置——棧的頂部。
ECMAScript為數組專門提供了 push()和 pop()方法,以便 實現類似棧的行為。
push()方法可以接收任意數量的參數,把它們逐個添加到數組末尾,並返回修改后數組的長度。
而 pop()方法則從數組末尾移除后一項,減少數組的 length 值,然后返回移除的項。
⑵示例:
var colors = new Array(); // 創建一個數組 var count = colors.push("red", "green"); // 推入兩項 alert(count); //2 count = colors.push("black"); // 推入另一項 alert(count); //3 var item = colors.pop(); // 取得最后一項 alert(item); //"black" alert(colors.length); //2
⑶以上代碼中的數組可以看成是棧(代碼本身沒有任何區別,而 push()和 pop()都是數組默認的方法)。
首先,我們使用 push()將兩個字符串推入數組的末尾,並將返回的結果保存在變量 count 中(值為 2)。
然后,再推入一個值,而結果仍然保存在 count 中。
因為此時數組中包含 3項,所以 push() 返回 3。
在調用 pop()時,它會返回數組的后一項,即字符串"black"。
此后,數組中僅剩兩項。
⑷可以將棧方法與其他數組方法連用,像下面這個例子一樣。
var colors = ["red", "blue"]; colors.push("brown"); // 添加另一項 colors[3] = "black"; // 添加一項 alert(colors.length); // 4 var item = colors.pop(); // 取得最后一項 alert(item); //"black"
㈥棧的經典應用:十進制轉換為二進制、八進制、十六進制
代碼如下:
const StackStudy = require('./stack.js'); const str = '0123456789ABCDEF'; function dataConversion(num, type) { let x = num; const s1 = new StackStudy(20); while (x != 0) { s1.enStack(x % type); x = Math.floor(x / type); } while (!s1.isEmpty()) { console.log(str[s1.deStack()]); } console.log('--------------------'); return; } dataConversion(1024, 8); // 測試八進制 dataConversion(1024, 16); // 測試十六進制 dataConversion(3000, 16); // 測試十六進制帶字母的情況 dataConversion(1024, 2); // 測試二進制
參考:1.https://cloud.tencent.com/developer/article/1496388
2.《JavaScript高級程序設計》