栈
什么是栈?
栈(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结束执行出栈,符合栈结构的“后进先出”规律