栈是数据结构中最基本的一种结构,对于数据来说,很多时候都是对数据的增、删、查、改
1.栈在生活中的常见例子
一摞书、堆盘子
2.栈的特点
先进后出(fist in last out,FILO)
3.栈的实现
1)创建栈
function Stack(){
let items=[];//通过数据来存储数据
//各种属性和方法的声明
}
2)栈中声明的方法
增:push(element(s)):添加一个或多个元素到栈顶
删:pop():移除栈顶的元素,同时返回被移除的元素
查:peek():返回栈顶的元素,不对栈做任何修改
isEmpty():查看栈是否为空,如果是,则返回true,为否,则为false
size():查看栈中元素个数,返回值为栈中元素的个数
改:clear():清空栈内的所有元素
3)具体实现
增:将元素进栈
this.push=function(element){
items.push(element);
}
删:将元素出栈
this.pop=function(){
return items.pop();
}
查:
1)查看栈顶元素
this.peek=function(){
return items[items.length-1];
}
2)查看栈是否为空
this.isEmpty=function(){
return itmes.length==0;
}
3)查看当前栈的元素个数
this.size=function(){
return items.length;
}
改:改动栈内元素(这里不是很准确,数据中的改应该是对某个元素来改动,这里为了方便自己记住,就这么归类了)
this.clear=function(){
items=[];//清空所有元素
}
打印栈中的所有元素:
使用toString()方法,将数组转为字符串
this.print=function(){
console.log(items.toString());
}
4.完整实现代码
function Stack(){
let items=[];
this.push=function(element){
items.push(element);//这里的写法只能每次压栈一个元素
}
this.pop=function(){
return items.pop();
}
this.peek=function(){
return items[items.length-1];
}
this.size=function(){
return items.length;
}
this.isEmpty=function(){
return items.length==0;
}
this.clear=function(){
items=[];
}
this.print=function(){
console.log(items.toString());
}
}
//测试部分
//声明一个实例
let stack=new Stack();
stack.isEmpty();//查看栈是否为空
stack.push(1);
stack.push(2);
console.log(stack.pop());
console.log(stack.size());
console.log(stack.isEmpty());
console.log(stack.peek());
console.log(stack.print());
5.栈的应用
在回溯问题中,可以存储访问过的任务或路径、撤销操作
使用栈的三个著名算法:
1)十进制转二进制问题
2)平衡圆括号问题
3)汉诺塔问题
十进制转二进制
思路:除2取余法,将每次求余得到的数入栈,出栈的顺序则为二进制数
function divideBy2(decNumber){
let remStack=new Stack(), //声明一个栈实例
rem; //存储余数
binaryString=''; //输出二进制数的字符串形式
while(decNumber>0){
rem=Math.floor(decNumber % 2);
remStack.push(rem);
decNumber=Math.floor(decNumber / 2);
}
while(!remStack.isEmpty()){
binaryString += remStack.pop().toString();
}
return binaryString;
}
//测试例子
console.log(divdeBy2(10));
扩展,实现十进制与任意进制转换算法
function baseConverter(decNumber,base){
var remStack=new Stack(), //声明一个stack实例
rem, //保存余数
baseString='', //输出的转换后的进制数
digits='0123456789ABCDEF'; //针对十六进制、八进制
while(decNumber>0){
rem=Math.floor(decNumber % base);
remStack.push(rem);
decNumber=Math.floor(decNumber / base);
}
while(!remStack.isEmpty()){
baseString += digits[remStack.pop()];
}
return baseString;
}
//测试例子
console.log(baseConverter(100345,2));