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--数据结构之栈的更多相关文章

  1. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  2. [C++/JavaScript]数据结构:栈和数列>案例引入(数制的转换)

    1 案例1:数制的转换 1.1 背景与原理 1.2 编程复现 (JavaScript版 复现) function convert(value, d){ stack = []; // 栈 result ...

  3. Javascript数据结构之栈

    作者原文:http://hawkzz.com/blog/blog/1515054561771 定义 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种先入后出的数据结构 ...

  4. JavaScript数据结构-4.栈操作

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  6. 学习javascript数据结构(四)——树

    前言 总括: 本文讲解了数据结构中的[树]的概念,尽可能通俗易懂的解释树这种数据结构的概念,使用javascript实现了树,如有纰漏,欢迎批评指正. 原文博客地址:学习javascript数据结构( ...

  7. javascript数据结构与算法---栈

    javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...

  8. JavaScript数据结构——栈和队列

    栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...

  9. javascript数据结构——栈

    栈是一种高效的数据结构,数据只能在栈顶添加或删除,所以这样操作很快,也很容易实现.栈的使用遍布程序语言实现的方方面面,从表达式求值到处理函数调用.接下来,用JavaScript实现一个栈的数据结构. ...

  10. 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈

    有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...

随机推荐

  1. Use Uncertainty As a Driver

     Use Uncertainty As a Driver Kevlin Henney ConFRonTEd WiTH TWo opTionS, most people think that the ...

  2. IDEA创建maven项目之后无法编写java类

    在创建Maven web项目之后无法再java文件夹下面创建java类,这里我可以教一下大家 选择你的文件夹,鼠标点击右键,出现下图所显示的,你可以按照下图所显示的步骤进行操作

  3. mybatis :实现mybatis分页

    上一篇文章里已经讲到了mybatis与spring MVC的集成,并且做了一个列表展示,显示出所有article 列表,但没有用到分页,在实际的项目中,分页是肯定需要的.而且是物理分页,不是内存分页. ...

  4. ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏

    初期:  一.基本算法:        (1)枚举. (poj1753,poj2965)       (2)贪心(poj1328,poj2109,poj2586)       (3)递归和分治法.   ...

  5. update-alternatives 命令

    update-alternatives 命令 1.功能作用 update-alternatives是dpkg的实用工具,用来维护系统命令的符号链接,以决定系统默认使用什么命令. 在Debian系统中, ...

  6. c# 读取导入的excel文件,循环批量处理数据

    dt = FM_HR_ShiftMaintenanceManager.GetCsvToDataTable(strConn, excelName,"XJSQMonthlyImportExcel ...

  7. 实现人脸识别性别之路---matplotlib

    Np.linspace(start,stop,num,endpoint,dtype)函数 1.参数:范围值,在范围值中取到的数值总数.是否包含范围值.类型 2.返回值:返回一维数据 3.在指定的范围内 ...

  8. BZOJ2636: crisis(可持久化线段树)

    传送门: 解题思路: 题目描述是一大坑点,cancel后面是直接加ask或者redo的. 那么就可以愉快地可持久化了. 注意需要支持区间修改,那么就只需要在再次更新这个点的时候将标记储存在新的儿子中. ...

  9. 推荐学习《算法之美:指导工作与生活的算法》中文PDF+英文PDF

    我们所有人的生活都受到有限空间和有限时间的限制,因此常常面临一系列难以抉择的问题.在一天或者一生的时光里,哪些事是我们应该做的,哪些是应该放弃的?我们对杂乱无序的容忍底线是什么?新的活动与熟悉并喜爱的 ...

  10. spring的事务如何配置

    spring的声明式事务配置: 1. <!-- 配置sessionFactory --> <bean id="sessionFactory" class=&quo ...