JavaScript--数据结构之栈

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 }

 

posted @ 2017-08-04 15:17  seafwg  阅读(180)  评论(0编辑  收藏  举报