一、概述

  • 栈内的元素只能通过一端进行访问,这一端叫做栈顶。
  • 咖啡厅的一摞盘子就是现实生活中常见的栈的例子,只能再最上面取盘子,盘子洗干净后,也只能摞在最上面
  • 栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构

二、对栈的操作实现类的封装

function stack(){
    this.dataStore = [];  //保存栈内元素
    this.top = 0;            //指向栈顶
    this.push = push;     //将一个元素压入栈
    this.pop = pop;       //访问栈顶元素,同时删除栈顶元素
    this.peek = peek;     //访问栈顶元素,但不删除栈顶元素
    this.length = length; //记录栈内元素的个数
    this.clear = clear;    //清空栈内所有元素
}
function push(data){
    this.dataStore[this.top++] = data;
}
function pop(data){
    return this.dataStore[--this.top];
}
function peek(data){
    return this.dataStore[this.top-1];
}
function length(){
    return this.top;
}
function clear(){
    this.top = 0;
}

三、测试Stack类的实现

var s = new stack();
s.push("monkey");
s.push("cat");
s.push("mall");
console.log(s.dataStore)
console.log(s.length());
console.log("the popped element is:"+s.pop());
console.log("length:"+s.length());
console.log("the peeked element is:"+s.peek());
console.log("length:"+s.length());
console.log(s.clear());
console.log("length:"+s.length());

这里写图片描述

四、栈的应用

  • 数制间的相互转换,算法如下
    • 最高位为n%b,将此位压入栈
    • 使用n/b代替n
    • 重复步骤1和2,直至n等于0,且没有余数
    • 持续将栈内元素弹出,直到栈为空,依次将这些元素排列,就得到转换后数字的字符串形式
function mulBase(num,base){
    var s = new stack();
    do{
        s.push(num%base);
        num =Math.floor(num / base); 
    }while(num>0)
    var str = '';
    while(s.length()>0){
        str += s.pop();
    }
    return str;
}
console.log(mulBase(10,2)); //1010
  • 判断给定的字符串是否是回文
    • 将字符串从左往右的顺序压入栈
    • 全部压入栈后,栈内保存了一个反转后的字符串
    • 持续弹出栈中的每个字母得到一个新字符串,该字符串与原字符串顺序相反
    • 判断两个字符串是否相等
function isPalindrome(str){
    var s = new stack();
    for(var i = 0;i<str.length;i++){
        s.push(str[i]);
    }
    var str1 = '';
    while(s.length()>0){
        str1 += s.pop();
    }
    if(str == str1){
        return true;
    }else{
        return false;
    }
}
console.log(isPalindrome("hfjdshfwhlu"));  //false
console.log(isPalindrome("asdfghjhgfdsa")); //true
  • 使用栈模拟递归
    • 下面是一个递归函数,可以计算任何数字的阶乘
function factorial(n){
    if(n==0){
        return 1;
    }else{
        return n*factorial(n-1);
    }
}
  • 使用栈模拟计算5!
    - 将数字从5到1压入栈
    - 使用循环将数字挨个弹出
function factorial(n){
    var s = new stack();
    while(n>1){
        s.push(n--)
    }
    var result=1;
    while(s.length()>0){
        result *= s.pop();
    }
    return result;
}
console.log(factorial(5)) //120
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值