JS資料結構和演算法 --- 棧
阿新 • • 發佈:2018-12-09
概念:表頭進行插入和刪除操作的線性表
核心思想:先進後出
作用:在程式語言的編譯器和記憶體中儲存變數、方法呼叫
操作方法:1)push() 進棧,即向棧裡新增元素
2)pop() 出棧,即把元素從棧中刪除
3)peak() 查詢棧頂元素,即查詢棧裡最頂部那個元素(最後新增)
4)isEmpty() 判斷棧是否為空
5)clear() 清空棧元素
6)size() 查詢棧的大小,即棧內元素個數
應用場景:1)進位制數的轉換; 2)有效字串的檢驗; 3)迷宮求解; 4)行編輯程式; 5)二叉樹的遍歷
棧的理解:可以把棧比作一個儲物櫃,進棧就是把物品放入儲物櫃,出棧即取出物品。像一般超市的寄存貨櫃,你把物品一個個的放進去(進棧),第一個放進去的在最裡面,依次堆積,最後一個放進去的在最外面;取物品時候,開櫃把商品一個個的取出來(出棧),首先取出的是最外面的一個商品(最後放進去的),然後依次往裡,也就是說最後放進去的最先取出,最先放進去的最後取出,即是棧的先進後出的思想。
在實際的開發中,會使用棧的思想去運算元組
例項:使用陣列來模擬棧的操作,並實現十進位制轉二進位制
/* jshint esversion: 6 */ /* 定義一個棧類 */ function stack(){ // 棧 let arr = []; //私有屬性,只有類裡面的方法可以方法 // 檢視棧 this.getArr = ()=>{ return arr; }, // 進棧push() this.push = (element)=>{ arr.push(element); }, // 出棧pop() this.pop = ()=>{ return arr.pop(); }, // 檢視棧頂peek() this.peek = ()=>{ return arr[arr.length-1]; // 倒數第一個元素 }, // 檢視棧是否為空isEmpty() this.isEmpty = ()=>{ return arr.length == 0; }, // 檢視棧元素個數size() this.size = ()=>{ return arr.length; }, // 清空棧clear() this.clear = ()=>{ arr = []; } } /* 十進位制轉二進位制 */ function decimalToBinary(num){ let s = new stack(); //呼叫上面的stack類 let remainder; while(num>0){ remainder = num%2; //去2的餘數,即0或1 s.push(remainder); num = Math.floor(num/2); //向下取整,如5÷2=2.5向下取整2 } return s.getArr().join(''); //把十進位制陣列轉成字串輸出 }
(完)