javascript 数据结构和算法读书笔记 > 第四章 栈

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;
}
时间: 2024-11-05 16:03:38

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

javascript 数据结构和算法读书笔记 &gt; 第三章 列表

1. 结构分析 列表首先要有以下几个属性: listSize 长度 pos 当前位置 dataStore 数据 我们要通过以下方法对上面三个属性进行操作: length() 获取长度 | getPos() 获取当前位置  | toString() 打印list内容 add(ele) 顺序添加元素 | insert(newEle, afterEle) 在某元素后插入元素 | remove(ele) 删除某元素 clear() 清空列表 | find(ele) 查询元素位置 | get(index)

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

第四章进程调度 进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统.调度程序是多任务操作系统的基础.通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的效果. 最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么总会有进程在执行. 4.1多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统.多任务能使多个进程处于堵塞或者睡眠状态.就是任务位于内存内但是不被执行,直到某一事件发生. 分类: l  非抢占式:除非进程自己主动停止运行

《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

第四章 Numpy基础:数组和矢量计算 实话说,用numpy的主要目的在于应用矢量化运算.Numpy并没有多么高级的数据分析功能,理解Numpy和面向数组的计算能有助于理解后面的pandas.按照课本的说法,作者关心的功能主要集中于: 用于数据整理和清理.子集构造和过滤.转换等快速的矢量化运算 常用的数组解法,如排序.唯一化.集合运算等 高效的描述统计和数据聚合/摘要运算 用于异构数据集的合并/连接运算的数据对齐和关系型数据运算 将条件逻辑表述为数组表达式(而不是带有if-elif-else分支

APUE读书笔记-第四章 文件和目录

到第四章了,不知什么时候才能把这本书看完,耽误的时间太多了. 第四章是在第三章的基础上,主要描述文件系统的其他性质和文件的性质. 4.2 stat.fstat.fstatat.lstat函数 首先来看看这四个函数的原型: #include <sys/stat.h> ///usr/include/x86_64-linux-gnu/sys/ int stat (const char *__restrict __file, struct stat *__restrict __buf) int fst

《javascript语言精粹》读书笔记(四)

本篇对这本书的附录进行摘要. 附录A:糟粕     A.1全局变量         全局变量是javascript所有糟糕特性中最糟糕的. 全局变量是在所有作用域中均可见的变量.如果某些全局变量碰巧和子程序中的变量名称相同,那么他们将互相冲突可能导致程序无法运行,通常还难以调试. 定义全局变量有3中方式: (1)脱离任何函数安排一个var语句: var foo=value; (2)直接添加一个属性到全局对象上,如果是web浏览器,全局对象名是window: window.foo=value; (

《javascript高级程序设计》读书笔记(四)引用类型

第五章:引用类型 Object类型 创建object实例的两种方式: 1.new方式 var person = new Object(); person.name = "haozk"; person.age = 24; 2.对象字面量表示法 var person = { name:"haozk", age:24 } 也可以将属性用字符串包围: var person = { "name":"haozk", "age&q

《JavaScript高级程序设计》 读书笔记(四)

由于 ECMAScript 中不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到 //例如: var count = 10; for (var i = 0; i < count; i++){ alert(i); } alert(i); //10 for-in语句for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性.以下是 for-in 语句的语法:for (property in expression) statement下面是一个示例:for (var propName i

数据结构与算法学习笔记(四)

单链表的整表创建 声明一结点p和计数器变量i 初始化一空链表L 让L的头结点的指针指向NULL,即建立一个带头结点的单链表 循环实现后继结点的赋值和插入 头插法:从一个空表开始,生成新节点,读取数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到结束位置.简单来说就是把新加进的元素放在表头后的第一个位置 先让新结点的next指向头结点之后 然后让表头的next指向新结点 void CreateListHead (LinkList *L,int n) { LinkList p; i

《JavaScript权威指南》读书笔记(四)

日期:2015-12-06 事件传播:1.捕捉阶段2.运行阶段3.起泡阶段cookie和客户端持久性::HTML5引入了web应用缓存.LocalStorage.SessionStorage:使用XMLHttpRequest:1.创建一个XMLHttpRequest对象:2.指定http请求并向一个服务器提交:3.同步或异步地获得服务器的响应:处理XML.脚本化客户端图形.SVG.canvas.脚本化applet.flash打算用到再看: