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; }
javascript 数据结构和算法读书笔记 > 第四章 栈的更多相关文章
- javascript 数据结构和算法读书笔记 > 第五章 队列
队列是一种列表,但是它只能够在队尾插入元素,在队首删除元素.队列用于存储按照顺序排列的数据,先进先出.而栈则是后入栈的元素反而被优先处理. 实际中一般被应用在进程池.排队操作上面. 1. 队列的操作 ...
- javascript 数据结构和算法读书笔记 > 第三章 列表
1. 结构分析 列表首先要有以下几个属性: listSize 长度 pos 当前位置 dataStore 数据 我们要通过以下方法对上面三个属性进行操作: length() 获取长度 | getPos ...
- javascript 数据结构和算法读书笔记 > 第二章 数组
这章主要讲解了数组的工作原理和其适用场景. 定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量. javascript数组的特殊之处: jav ...
- javascript 数据结构和算法读书笔记 > 第一章 javascript的编程环境和模型
1.变量的声明和初始化 必须使用关键字 var,后跟变量名,后面还可以跟一个赋值表达式. var name; var age = 5; var str = 'hello'; var flg = fal ...
- 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度
<Linux内核设计与实现>第八周读书笔记——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配 ...
- 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度
20135307 张嘉琪 第八周读书笔记 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有 ...
- 《Linux内核分析》读书笔记(四章)
<Linux内核分析>读书笔记(四章) 标签(空格分隔): 20135328陈都 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行 ...
- 4 Visual Effects 视觉效果 读书笔记 第四章
4 Visual Effects 视觉效果 读书笔记 第四章 Well, circles and ovals are good, but how about drawing r ...
- STL源码剖析读书笔记--第四章--序列式容器
1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...
随机推荐
- c#中的数据类型简介(委托)
c#中的数据类型简介(委托) 什么是委托? 委托是一种类型,它封装了一类方法,这些方法具有相同的方法签名(signature).定义听起来有点拗口,首先可以确定委托是一种数据类型,那么什么是方法签名, ...
- [Effective Modern C++] Item 2. Understand auto type deduction - 了解auto类型推断
条款二 了解auto类型推断 基础知识 除了一处例外,auto的类型推断与template一样.存在一个直接的从template类型推断到auto类型推断的映射 三类情况下的推断如下所示: // ca ...
- .Net Service部署(二)
1. 以管理员权限运行cmd.exe2. 安装服务 安装服务需要注意的是,如果电脑已经安装了此服务,需要先停止服务然后删除服务, 在进行安装注册,注册前先运行 cd C:\Windows\Micro ...
- Bootstrap+Thinkphp3.2+Auth认证+jquery-validator后台
Auth权限认证 本例采用auth权限认证,用户和用户组采用多对多关系处理,自动添加rule规则,带有jquery-validator插件,自动控制菜单显示或隐藏. config.php中的配置 ...
- Spring 系列: Spring 框架简介(转载)
Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...
- Oracle EBS-SQL (QA-3):检查已检验未入库.sql
DEFINE RECE="%" SELECT rsh.receipt_num 收据号, ...
- 从一个Bug说开去--解决问题的思路,Linked Server, Bulk Insert, DataTable 作为参数传递
声名— 部分内容为杜撰,如有雷同,不胜荣幸! 版权所有,如要引用,请标明出处! 如果打赏,请自便! 1 背景介绍 最近一周在忙一个SQL Server 的Bug,一个简单的Bug,更新两张 ...
- MEMS陀螺仪(gyroscope)的结构
MEMS陀螺仪(gyroscope)的设计和工作原理可能各种各样,但是公开的MEMS陀螺仪均采用振动物体传感角速度的概念.利用振动来诱导和探测科里奥利力而设计的MEMS陀螺仪没有旋转部件.不需要轴承, ...
- android邮件发送几种方式
android中发送邮件我大概发现了3种,代码如下 package src.icetest; import org.apache.commons.mail.EmailException; import ...
- NoSql 精粹导读图