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++的源码: #include <cstdio> using namespace std; class X { public: int get1() { ; } virtual ...
- Sublime Text2 快捷键设置
设置Tab两个空格: 点击 Preference -> Settings-User "tab_size":2, "translate_tabs_to_spaces& ...
- Sphinx Makefile
# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPT ...
- SARscape5.2哨兵1A数据的读取
SARscape5.2支持哨兵1A数据的读取,支持的数据类型有: SM SLC ——条带模式的斜距单视复数产品 IW SLC——干涉宽幅模式(TOPS Mode)的斜距单视复数产品 EW SLC——超 ...
- let区别(关于racket和r5rs)
R5RS is the Revised5 Report on the Algorithmic Language Scheme.参考http://www.schemers.org/Documents/S ...
- 【每日一MOS】-RAC and Sequences (853652.1)
序列有四种组合: a. CACHE + NOORDER b. CACHE + ORDER c. NOCACHE + NOORDER d. NOCACHE + ORDER 即使在单例配置下,当有大量的s ...
- sql的基本查询语句
--------------------------------------------基本常用查询-------------------------------------- 自己简单练习做了个表. ...
- Knots(找规律)
Knots Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- poj 2411 Mondriaan's Dream 【dp】
题目:id=2411" target="_blank">poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然 ...
- Swift版音乐播放器(简化版),swift音乐播放器
这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...