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.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...
随机推荐
- 运行加速多线程和GPU
http://blog.csdn.net/augusdi/article/details/11883003
- jquery 项目所用
<script> $(document).ready(function(){ $.ajax({ type:'post', url :'interface.ajax.php', data:{ ...
- 设计师如何为 Android 应用标注尺寸
http://blog.cutterman.cn/?p=33 1. 画布大小定位 720 x 1280,72 dpi2. 只使用偶数单位的尺寸,比如 96 px 的列表项高度,16 px 的边距,64 ...
- Python之路第九天,高级(1)-网络编程
SOCKET编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...
- a标签的click事件问题
easy知识点, a标签的click事件和href共存会在执行click事件后触发href里面的链接,如果把href设为空字符串:href="",则会使用当前页面的url作为跳转链 ...
- java学习一目了然——异常必知
java学习一目了然--异常必知 我们只要学java,异常肯定非常熟悉,该抛的时候抛一下就行.但是这其中还有点小细节需要注意.就用这个小短篇来说一下异常处理中的小细节吧. 异常处理 RuntimeEx ...
- django models 类型整理 version:1.8.3
django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 F ...
- JVM GC之一找出不可达对象并回收
JAVA运行时数据区域 1.程序计数器:当前线程所执行的字节码的行号指示器.一个处理器只会执行一条线程中的指令,为了线程切换后能回复到正确的执行位置,所以每条线程都需要一个独立的计数器.各条线程之间互 ...
- bzoj2014 [Usaco2010 Feb]Chocolate Buying
Description 贝西和其他奶牛们都喜欢巧克力,所以约翰准备买一些送给她们.奶牛巧克力专卖店里 有N种巧克力,每种巧克力的数量都是无限多的.每头奶牛只喜欢一种巧克力,调查显示, 有Ci头 ...
- linux之SQL语句简明教程---DISTINCT
SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料.这将把所有的资料都抓出,无论资料值有无重复.在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况.换句话说,我们需要知道这个表格 ...