栈
来源:互联网 发布: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