1. 对栈的操作

栈是一种特殊的列表,栈中的元素只能通过列表的一端进行访问,即栈顶。类似于累起一摞的盘子,只能最后被放在上面的,最先能被访问到。

就是我们所说的后入先出(LIFO)。

对栈主要有入栈push,出栈pop,获得栈顶元素peek, 三个方法。

2. 栈的实现

基本类结构如下:

function Stack(){
    this.dataStore = [];
    this.top = 0;
    this.push = push;
    this.pop = pop;
    this.peek = peek;   this.length = length;    this.clear = clear;}

关于进栈操作:

function push(obj){
     this.dataStore[this.top++] = obj;
}

出栈:

function pop(){  if(this.top!=0){
       return this.dataStore[--this.top];   }else{       return undefined;   }
}

获取栈顶元素:

function peek(){
    return this.dataStore[this.top-1];
}

获取长度:

function length(){
    return this.top;
}

清空:

function clear(){
     this.top = 0;
}

3 使用 Stack 类

   a) 数制间的相互转换

  可以利用栈来做10进制转2~9进制的操作

  方法如下:一个十进制数a,进制b

    1> 将a%b,压入栈内

    2> 用a/b替换a

    3> 如果a大于0,继续重复撞到1>进行操作

      如果小于0,跳出

    4> 将栈中元素一次弹出,组成一个新的字符(该字符就是转换完成的结果)

  举个例子:

  10 转为 2 进制:

  10%2 = 0   ——入栈—— 0

  5%2 = 1   ——入栈—— 1, 0

  2%2 = 0   ——入栈—— 0, 1, 0

  1%2 = 1   ——入栈—— 1, 0, 1, 0

  最后出栈顺序就是1010

  代码如下:  

function mulNum(num, base){
    var stack = new Stack();
    //    操作三
    while(num>0){
        //    操作一
        stack.push(num%base);
        //    操作二(注意要取整)
        num = Math.floor(num/base);
    }
    var rs = '';
    for(stack.length>0){
         rs += stack.pop();
   }
   return rs;
}

 b) 回文

  

function isPalindromic(str){
    var stack = new Stack();
    for(var i=0;i<str.length;i++){
         stack.push(str[i]);
    }
    var revStr;
    while(stack.length()>0){
        revStr += stack.pop();
    }
    if(revStr === str){
        return true;
    }else{
        return false;
    }
}

就是通过stack对其进行了翻转操作。

  c) 递归演示

第一章中提到过递归求阶乘的方法,这里我们使用stack来求阶乘,模拟递归:

function(num){
    var rs = 1;
    var stack = new Stack();
    while(num>1){
       stack.push(num--);
    }
    while(stack.length>0){
       rs *= stack.pop();
    }
    return rs;
}

javascript 数据结构和算法读书笔记 > 第四章 栈的更多相关文章

  1. javascript 数据结构和算法读书笔记 > 第五章 队列

    队列是一种列表,但是它只能够在队尾插入元素,在队首删除元素.队列用于存储按照顺序排列的数据,先进先出.而栈则是后入栈的元素反而被优先处理. 实际中一般被应用在进程池.排队操作上面. 1. 队列的操作 ...

  2. javascript 数据结构和算法读书笔记 > 第三章 列表

    1. 结构分析 列表首先要有以下几个属性: listSize 长度 pos 当前位置 dataStore 数据 我们要通过以下方法对上面三个属性进行操作: length() 获取长度 | getPos ...

  3. javascript 数据结构和算法读书笔记 > 第二章 数组

    这章主要讲解了数组的工作原理和其适用场景. 定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量. javascript数组的特殊之处: jav ...

  4. javascript 数据结构和算法读书笔记 > 第一章 javascript的编程环境和模型

    1.变量的声明和初始化 必须使用关键字 var,后跟变量名,后面还可以跟一个赋值表达式. var name; var age = 5; var str = 'hello'; var flg = fal ...

  5. 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度

    <Linux内核设计与实现>第八周读书笔记——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配 ...

  6. 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度

    20135307 张嘉琪 第八周读书笔记 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有 ...

  7. 《Linux内核分析》读书笔记(四章)

    <Linux内核分析>读书笔记(四章) 标签(空格分隔): 20135328陈都 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行 ...

  8. 4 Visual Effects 视觉效果 读书笔记 第四章

    4   Visual Effects    视觉效果        读书笔记 第四章 Well, circles and ovals are good, but how about drawing r ...

  9. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

随机推荐

  1. 查看DB文件的空间使用情况

    可以使用如下语句获得DB文件的空间使用 use dbName SELECT DB_NAME() AS DbName, name AS FileName, size/128.0 AS CurrentSi ...

  2. php不区分大小写

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. java static关键字

    方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问. static可以用来修饰类的 ...

  4. (转+原)VC编译错误:uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义

    参考网址:http://zhanyonhu.blog.163.com/blog/static/16186044201023094754832/ 1>uafxcw.lib(afxmem.obj) ...

  5. (原)JNI中env->GetByteArrayElements和AndroidBitmap_getInfo的冲突

    也不是很确定,前段时间的代码没有出问题,但是今天调试了半天,一直崩溃:vm aborting. 以前的部分代码: JNIEXPORT void JNICALL XXX (JNIEnv* env,job ...

  6. Oracle学习之常见错误整理

    一.ORA-12154: TNS: 无法解析指定的连接标识符 在程序中连接Oracle数据库的方式与其他常用数据库,如:MySql,Sql Server不同,这些数据库可以通过直接指定IP的方式连接, ...

  7. 匈牙利算法(素数伴侣(HW1112))

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> #include<string&g ...

  8. VS2012常用快捷建(必备)

    1. 强迫智能感知:Ctrl+J:2.强迫智能感知显示参数信息:Ctrl-Shift-空格:3.格式化整个块:Ctrl+K+F4. 检查括号匹配(在左右括号间切换): Ctrl +]5. 选中从光标起 ...

  9. MYSQL 表分区的 3 方法

    背景知识: 表分区是把逻辑上同一范围的数据保存到同一个文件中,就和超市一样,把同类商品放在同一个区域,把不同的商品放在不同的地方.不同的是超市中 是根据用途分类的,表分区是根据它的取值区间来分的. 分 ...

  10. SQL连接方式(内连接,外连接,交叉连接)

    1.内连接.左连接.右连接.全连接介绍 內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来.内部连接是两个表中都必须有连接字段的对应值的记录,数据才能检索出来.   左连 ...