棧
什麼是棧?
棧(Skipper):一種後進先出(LIFO:last in first out)的數據結構。
- 棧結構的基本概念:棧頂,棧底,入棧,出棧
- 棧結構的相關操作
push入棧,pop出棧,peek檢查棧頂元素,isEmplty是否爲空,clear清空棧,size棧元素
棧結構的實現——數組
- 實踐:使用類來封裝一個數組操作
function Stack(){
var items = []; // 用var的目的是爲了私有變量,而不用this.items.
// 入棧
this.push=function(item){
items.push(item)
}
// 獲取棧頂元素
this.peek = function(){
return items[items.length-1];
}
// 出棧:拿出棧頂元素
this.pop = function(){
items.pop()
}
// 棧是否爲空
this.isEmpty = function(){
return items.length===0
}
// 清空棧
this.clear = function(){
item = []
}
// 棧大小
this.size = function(){
return items.length;
}
}
棧實例:十進制轉二進制數
原理:十進制轉2進制即十進制數對2取餘,每次得到的餘數則由底到頂拼接。
原理:
1、需要拿到的數? 如上圖,每一次取餘數,每一次取除2後的最小整數
2、將每次取出的餘數添加到棧結構
3、每次取出棧頂數拼接成二進制 。如上圖從最後除不盡的數1,到每次餘數拼接結果,1010
function to2(num){
var stack = new Stack();
var yushu;
var res='';
while(num>0){ // 不斷取餘,入棧
yushu = num % 2;
stack.push(yushu);
num = Math.floor(num / 2);
}
while(!stack.isEmpty()){ // 出棧拿結果
res += stack.pop();
}
return res;
}
console.log(to2(10)); // 1010
棧的應用場景
- 棧的作用:在編程語言的編譯器和內存中保存變量、方法調用
- 棧和函數(函數調用棧):在計算機內存棧中,函數先調用先入棧,調用結束則出棧。如下結構
function fn1(){
console.log('fn1 finished')
}
function fn2(){
fn1();
console.log('fn2 finished')
}
fn2(); // fn1 finished--->fn2 finished
- 如上:fn2先調用進入內存棧,fn1後入棧,然後fn1執行完先出棧,fn2結束執行出棧,符合棧結構的“後進先出”規律