JavaScript--数据结构之栈
4.1栈是一种高效的数据结构,是一种特殊的列表。栈内元素只能通过列表的一端访问,也就称为栈顶。后入的先出的操作。Last in First out.所以他的访问每次是访问到栈顶的元素,要想访问其余的元素必须要它上面的元素出栈操作后才能访问。
有两个主要的方法:
push();入栈操作
pop();出栈操作,永久的删除了。
peek();该方法是只返回栈顶元素,只读不写的操作。
clear();清除栈内所有元素。
栈的属性:
top:用来记录栈顶元素的位置,可以标记新的元素。初始为0,push元素后值加一,pop元素后值减一。
length:记录栈内元素的个数。
empty:用来表示栈内是否有元素,但用length同样可以实现。
4.2栈的实现:采用数组实现
function Stack() {
this.dataStore = [];//存放元素
this.top = 0;//记录栈顶元素,初始化为0,栈顶对应的数组元素的起始位置,如果有压入元素对应的top值发生变化。
this.push = push;
this.pop = pop;
this.peek = peek;
this.length = length;
this.clear = clear;
}
push();方法的实现
function push(element) {
this.dataStore[this.top++] = element;//把传进来的元素添加到数组中,放在top当前的位置,然后让top的位置指向向下一个
}
pop();方法的实现
function pop() {
return this.dataStore[--this.top];//返回栈顶元素,同时让top的值减一。
}
peek();方法的实现
function peek() {
return this.dataStore[this.top-1];//返回的是数组的top-1的位置的元素,即栈顶元素
}
如果对一个空栈调用peek();方法则返回undefined;因为栈是空的,栈顶没有任何元素。
length();方法的实现
function length() {
return this.top;//返回变量top的值即可实现栈内元素的个数
}
clear();方法的实现
function clear() {
this.top = 0;//让栈顶位置为0即可轻松清除栈内元素
}
4.3 Stack的使用
4.3.1 数值之间的转换
1.最高位n%b的数压入栈底。
2.使用n/b代替n。
3.重复1,2直至n等于0时,且没有余数。
4.持续将栈内元素弹出,直至栈为空,依次将这些元素排列得到转换后数字的字符串形式。
function numConvert(num,base) {
var stack = new Stack();
do{
stack.push(num%base);//余数压进栈中
num = Math.floor(num/=base);//对商数做下取整进行赋值,以便上一步的重复操作
}while(num>0);
var converted = "";
while(stack.length>0) {
converted += stack.pop();//依次出栈操作
}
return converted;
}
4.3.2 回文:是指一个单词,短语,一句话,一段数字从前往后写和从后往前写都是一样的。利用栈可以轻松地判断。
对所查询的字符串进行依次入栈操作,然后进行出栈操作生成新的字符串,进行和原来的字符串比较,相同返回true。
function isPalindrome(word) {
var s = new Stack();
for(var i = 0;i < word.length;i++) {
s.push(word[i]);
}
var rWord = "";
while(s.length > 0) {
rWord += s.pop();
}
if(word == rWord) {
return true;
}
if(word != rWord) {
return false;
}
}
4.3.3 递归的演示
eg: 5! = 5*4*3*2*1;
function factorial(num) {
if(num === 0) {
return 1;
}else{
return num * factorial(num-1);
}
}
用栈进行模拟操作,对所要求的数循环减一push栈中,出栈时做连乘操作
function factiorial(num) {
var s = new Stack();
while(num > 1) {//对大于1的数求阶乘
s.push(num--);
}
var result = 1;
while(s.length() > 0) {
result *= s.pop();//出栈时做连乘操作
}
return result;
}
JavaScript--数据结构之栈的更多相关文章
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- [C++/JavaScript]数据结构:栈和数列>案例引入(数制的转换)
1 案例1:数制的转换 1.1 背景与原理 1.2 编程复现 (JavaScript版 复现) function convert(value, d){ stack = []; // 栈 result ...
- Javascript数据结构之栈
作者原文:http://hawkzz.com/blog/blog/1515054561771 定义 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种先入后出的数据结构 ...
- JavaScript数据结构-4.栈操作
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- 学习javascript数据结构(四)——树
前言 总括: 本文讲解了数据结构中的[树]的概念,尽可能通俗易懂的解释树这种数据结构的概念,使用javascript实现了树,如有纰漏,欢迎批评指正. 原文博客地址:学习javascript数据结构( ...
- javascript数据结构与算法---栈
javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...
- JavaScript数据结构——栈和队列
栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...
- javascript数据结构——栈
栈是一种高效的数据结构,数据只能在栈顶添加或删除,所以这样操作很快,也很容易实现.栈的使用遍布程序语言实现的方方面面,从表达式求值到处理函数调用.接下来,用JavaScript实现一个栈的数据结构. ...
- 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...
随机推荐
- CSS浏览器兼容问题集(一)
CSS对浏览器的兼容性有时让人非常头疼,也许当你了解其中的技巧跟原理,就会认为也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2.0的过度,请尽量用xhtml ...
- Codeforces Round #313 (Div. 2) 解题报告
A. Currency System in Geraldion: 题意:有n中不同面额的纸币,问用这些纸币所不能加和到的值的最小值. 思路:显然假设这些纸币的最小钱为1的话,它就能够组成随意面额. 假 ...
- HDU 4183Pahom on Water(网络流之最大流)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4183 这题题目意思非常难看懂..我看了好长时间也没看懂..终于是从网上找的翻译. .我就在这翻译一下吧 ...
- AES加密解密在JAVA和ANDROID下互通
<span style="font-family: Arial, Helvetica, sans-serif;">昨天外包安卓的那个人说AES的加解密结果不一样.于是百 ...
- 如何判断自己IP是内网IP还是外网IP
tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0-10.255.255.255 172.16.0.0/12:172.16.0.0- ...
- SQL 查找存在某内容的存储过程
--查找存在某表名的存储过程 SELECT distinct b.name from syscomments a,sysobjects b WHERE a.id=b.id and a.TEXT LIK ...
- 浅述html5和web app
题外话:最近跟不少产品解释技术术语,比如脚本.数据库.H5等等,我一般会把他们当成稍微了解这些技术的人,用专业的语言描述一遍,然后用通俗的语言解释一遍,最后举例子解释一遍. 肯定有人问,你把流程反过来 ...
- flex RemoteObject 的两种使用方法
这里使用的是django1.6 和 postgreSQL9.0 FlashBuilder4.5 django方面就不说了,根据文档来做,建好模块,配置好数据库等等 创建 gateway 和 time ...
- snmpd修改端口
http://blog.csdn.net/cau99/article/details/5077239 http://blog.csdn.net/gua___gua/article/details/48 ...
- 洛谷 P1889 士兵站队
P1889 士兵站队 题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军 ...