目录
1、栈是个啥?
栈(stack),它是一种受限的线性表,后进先出(LIFO — last in first out)。栈结构仅允许在表的一端进行插入和删除运算,这一端被称为栈顶,相对地,把另一端称为栈底。LIFO(last in first out)表示就是后进入的元素,第一个弹出栈空间,类似于自动餐托盘,最后放上的托盘,往往先把拿出去使用。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。示意图如下:
2、栈的常见操作
方法 | 说明 |
push() | 添加一个新元素到栈顶位置 |
pop() | 移除栈顶的元素,同时返回被移除的元素 |
peek() | 返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它) |
isEmpty() | 如果栈里没有任何元素就返回true,否则返回false |
size() | 返回栈里的元素个数。这个方法和数组的length属性很类似 |
toString() | 将栈结构的内容以字符形式返回 |
3、封装栈结构
基于数组的方式实现栈结构,在封装的 Stack() 类的原型上添加栈的一些方法。
function Stack(){//封装栈类
this.items = [];//栈中的属性
//栈的相关操作
//1.将元素压入栈
//this.push = function(){} 这样是给每个对象实例添加一个方法,比较耗费内存
Stack.prototype.push = function(element){ //这种方式更好,给原型添加方法,所有的对象实例都能继承
this.items.push(element);
}
//2.从栈中取出元素
Stack.prototype.pop = function(){
return this.items.pop()
}
//3.查看一下栈顶的元素
Stack.prototype.peek = function(){
return this.items[this.items.length -1]
}
//4.判断栈内是否为空
Stack.prototype.isEmpty = function(){
return this.items.length == 0
}
//5,获取栈中元素个数
Stack.prototype.size = function(){
return this.items.length
}
//6.toString方法
Stack.prototype.toString = function(){
var resultString = '';
for(var i in this.items){
resultString += this.items[i] + '-'
}
return resultString;
}
}
4、栈的使用
基于刚才封装的栈,进行一些栈的基本操作。
var stack = new Stack();//栈的使用
stack.push(111);
stack.push(110);
stack.peek(); //110
stack.pop(); //110
stack.isEmpty(); //false
alert(stack); //111
5、栈结构的应用 — 十进制转二进制
现实生活中,我们主要使用十进制,但在计算机里的所有内容都是用二进制数字表示的(0和1),没有十进制和二进制相互转化的能力,与计算机交流就很困难。
(1)主要原理:如何实现十进制转二进制?要把十进制转化成二进制,可以将该十进制数字和2整除(二进制是满二进一),直到结果是0为止。将每一步的余数进栈,最后将栈中的内容其输出,输出的结果就是该十进制数对应的二进制数了。比如将一个十进制数 10,转化成对应的二进制数,其过程大概如下所示:
(2)代码实现:
function dec2bin(numer) { //封装十进制转二进制的函数
var stack = new Stack(); //定义一个栈
var remainder; //定义一个变量保存余数
// 循环除法
while (numer > 0) {
remainder = numer % 2; //获取每次除2后的余数
numer = Math.floor(numer / 2); //获取每次除2后的商(向下取整),赋值给number,作为下一次除法的被除数
stack.push(remainder); //将余数依次压栈
}
// 将数据取出
var binaryString = ""; //定义一个容器,存放出栈元素
while (!stack.isEmpty()) {
binaryString += stack.pop(); //将元素依次出栈
}
return binaryString; //最后将所有出栈元素输出
}
// 测试函数
alert(dec2bin(10)); //1010