zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    BZOJ 2055 80人环游世界 有上下界最小费用可行流
    BZOJ 2406 LuoguP4194 矩阵 有上下界可行流
    BZOJ4873 LuoguP3749 寿司餐厅
    51nod 1551 集合交易 最大权闭合子图
    BZOJ 1565 植物大战僵尸 最大权闭合子图+网络流
    [CodeForces]460C Present
    [BZOJ5072] 小A的树
    [TJOI2015]组合数学
    [HNOI2006]鬼谷子的钱袋
    [IOI2007]矿工配餐
  • 原文地址:https://www.cnblogs.com/intelwisd/p/7285311.html
Copyright © 2011-2022 走看看