来源:互联网 发布:sql nvl to_number 编辑:程序博客网 时间:2024/06/15 20:25

一、概述

  • 栈内的元素只能通过一端进行访问,这一端叫做栈顶。
  • 咖啡厅的一摞盘子就是现实生活中常见的栈的例子,只能再最上面取盘子,盘子洗干净后,也只能摞在最上面
  • 栈被称为一种后入先出(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"));  //falseconsole.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
原创粉丝点击