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