目录
1、什么是栈?
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
2、栈的封装
function Stack(){
this.items = [];
// 对象内称之为方法,而不是函数
// Methods: 和某一个对象实例有联系
// function:
// this.push = function(this){
// }
// 需要利用原型,这种方法是共享的,也会节省更多的内存空间并且效率更高一点,相当于给整个类添加一个方法,而上面的方式相当于给某一个对象的实例添加一个方法,在JavaScript中是基于对象。
// 栈的相关操作
// 1、封装push函数,将一个元素放入栈的顶部。将元素压入栈中。
Stack.prototype.push = function(element){
this.items.push(element);
}
// 2、封装pop函数,将栈顶的一个元素删除,并返回栈顶元素。从栈中取出元素。
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;
}
// 6toString 方法
Stack.prototype.toString = function(){
var resultString = '';
for (var i = 0; i < this.items.length; i++) {
resultString += this.items[i] + ' ';
}
return resultString;
}
}
3、栈的检验
// 定义一个栈对象
var s = new Stack();
// 将20 100 10 60堆入栈中
s.push(20);
s.push(100);
s.push(10);
s.push(60);
// 输出栈
alert(s); //20 100 10 60
// 从栈顶中取出元素
s.pop();
alert(s);//20 100 10
// 获取栈顶元素
alert(s.peek()); // 10
// 获取栈的长度
alert(s.size()); // 3
// 输出栈
alert(s.toString()); //20 100 10
// 判断栈是否为空
alert(s.isEmpty()); // false
4、栈的应用
十进制转二进制的思路:
将每一次除于2的余数压入栈中,再用整除的数作为下一次运算的数字,最后从栈中取出0和1(反转栈)。
// 例子:写一个十进制转二进制的函数
function dec2din(decNumber){
// 定义栈对象
var s = new Stack();
// 2、循环操作
while(decNumber > 0){
// 2.1、获取余数,依次压入到栈中
s.push(decNumber % 2);
// 2.2、获取整除后的结果,作为下一个运算的数字
decNumber = Math.floor(decNumber / 2);
}
// 3、从栈中取出0和1。
var binaryString = '';
while(!s.isEmpty()){
binaryString += s.pop();
}
return binaryString;
}
alert(dec2din(100)); // 1100100
alert(dec2din(10)); // 1010
alert(dec2din(126)); // 1111110