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)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...
随机推荐
- Use Uncertainty As a Driver
 Use Uncertainty As a Driver Kevlin Henney ConFRonTEd WiTH TWo opTionS, most people think that the ...
- IDEA创建maven项目之后无法编写java类
在创建Maven web项目之后无法再java文件夹下面创建java类,这里我可以教一下大家 选择你的文件夹,鼠标点击右键,出现下图所显示的,你可以按照下图所显示的步骤进行操作
- mybatis :实现mybatis分页
上一篇文章里已经讲到了mybatis与spring MVC的集成,并且做了一个列表展示,显示出所有article 列表,但没有用到分页,在实际的项目中,分页是肯定需要的.而且是物理分页,不是内存分页. ...
- ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ...
- update-alternatives 命令
update-alternatives 命令 1.功能作用 update-alternatives是dpkg的实用工具,用来维护系统命令的符号链接,以决定系统默认使用什么命令. 在Debian系统中, ...
- c# 读取导入的excel文件,循环批量处理数据
dt = FM_HR_ShiftMaintenanceManager.GetCsvToDataTable(strConn, excelName,"XJSQMonthlyImportExcel ...
- 实现人脸识别性别之路---matplotlib
Np.linspace(start,stop,num,endpoint,dtype)函数 1.参数:范围值,在范围值中取到的数值总数.是否包含范围值.类型 2.返回值:返回一维数据 3.在指定的范围内 ...
- BZOJ2636: crisis(可持久化线段树)
传送门: 解题思路: 题目描述是一大坑点,cancel后面是直接加ask或者redo的. 那么就可以愉快地可持久化了. 注意需要支持区间修改,那么就只需要在再次更新这个点的时候将标记储存在新的儿子中. ...
- 推荐学习《算法之美:指导工作与生活的算法》中文PDF+英文PDF
我们所有人的生活都受到有限空间和有限时间的限制,因此常常面临一系列难以抉择的问题.在一天或者一生的时光里,哪些事是我们应该做的,哪些是应该放弃的?我们对杂乱无序的容忍底线是什么?新的活动与熟悉并喜爱的 ...
- spring的事务如何配置
spring的声明式事务配置: 1. <!-- 配置sessionFactory --> <bean id="sessionFactory" class=&quo ...