4.1栈是一种高效的数据结构,是一种特殊的列表。栈内元素只能通过列表的一端访问,也就称为栈顶。后入的先出的操作。Last in First out.所以他的访问每次是访问到栈顶的元素,要想访问其余的元素必须要它上面的元素出栈操作后才能访问。
有两个主要的方法:
push();入栈操作
pop();出栈操作,永久的删除了。
peek();该方法是只返回栈顶元素,只读不写的操作。
clear();清除栈内所有元素。
栈的属性:
top:用来记录栈顶元素的位置,可以标记新的元素。初始为0,push元素后值加一,pop元素后值减一。
length:记录栈内元素的个数。
empty:用来表示栈内是否有元素,但用length同样可以实现。
4.2栈的实现:采用数组实现
1 function Stack() { 2 this.dataStore = [];//存放元素 3 this.top = 0;//记录栈顶元素,初始化为0,栈顶对应的数组元素的起始位置,如果有压入元素对应的top值发生变化。 4 this.push = push; 5 this.pop = pop; 6 this.peek = peek; 7 this.length = length; 8 this.clear = clear; 9 } 10 push();方法的实现 11 function push(element) { 12 this.dataStore[this.top++] = element;//把传进来的元素添加到数组中,放在top当前的位置,然后让top的位置指向向下一个 13 } 14 pop();方法的实现 15 function pop() { 16 return this.dataStore[--this.top];//返回栈顶元素,同时让top的值减一。 17 } 18 peek();方法的实现 19 function peek() { 20 return this.dataStore[this.top-1];//返回的是数组的top-1的位置的元素,即栈顶元素 21 } 22 如果对一个空栈调用peek();方法则返回undefined;因为栈是空的,栈顶没有任何元素。 23 length();方法的实现 24 function length() { 25 return this.top;//返回变量top的值即可实现栈内元素的个数 26 } 27 clear();方法的实现 28 function clear() { 29 this.top = 0;//让栈顶位置为0即可轻松清除栈内元素 30 }
4.3 Stack的使用
4.3.1 数值之间的转换
1.最高位n%b的数压入栈底。
2.使用n/b代替n。
3.重复1,2直至n等于0时,且没有余数。
4.持续将栈内元素弹出,直至栈为空,依次将这些元素排列得到转换后数字的字符串形式。
1 function numConvert(num,base) { 2 var stack = new Stack(); 3 do{ 4 stack.push(num%base);//余数压进栈中 5 num = Math.floor(num/=base);//对商数做下取整进行赋值,以便上一步的重复操作 6 }while(num>0); 7 var converted = ""; 8 while(stack.length>0) { 9 converted += stack.pop();//依次出栈操作 10 } 11 return converted; 12 }
4.3.2 回文:是指一个单词,短语,一句话,一段数字从前往后写和从后往前写都是一样的。利用栈可以轻松地判断。
对所查询的字符串进行依次入栈操作,然后进行出栈操作生成新的字符串,进行和原来的字符串比较,相同返回true。
1 function isPalindrome(word) { 2 var s = new Stack(); 3 for(var i = 0;i < word.length;i++) { 4 s.push(word[i]); 5 } 6 var rWord = ""; 7 while(s.length > 0) { 8 rWord += s.pop(); 9 } 10 if(word == rWord) { 11 return true; 12 } 13 if(word != rWord) { 14 return false; 15 } 16 } 17 4.3.3 递归的演示 18 eg: 5! = 5*4*3*2*1; 19 function factorial(num) { 20 if(num === 0) { 21 return 1; 22 }else{ 23 return num * factorial(num-1); 24 } 25 } 26 用栈进行模拟操作,对所要求的数循环减一push栈中,出栈时做连乘操作 27 function factiorial(num) { 28 var s = new Stack(); 29 while(num > 1) {//对大于1的数求阶乘 30 s.push(num--); 31 } 32 var result = 1; 33 while(s.length() > 0) { 34 result *= s.pop();//出栈时做连乘操作 35 } 36 return result; 37 }