在上一篇博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈。栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现。
一:对栈的操作。
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端陈为栈顶。比如餐馆里面洗盘子,只能先洗最上面的盘子,盘子洗完后,也只能螺到这一摞盘子的最上面。栈被称为 "后入先出"(LIFO)的数据结构。
由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访问,为了得到栈低的元素,必须先拿掉上面的元素。我们可以对栈的两种主要操作是将一个元素 压入栈 和 将一个元素 弹出栈。入栈我们可以使用方法push()方法,出栈我们使用pop()方法。pop()方法虽然可以访问栈顶的元素,但是调用该方法后,栈顶元素也就从栈中被永久性的删除了。另一个我们很常用的方法是peek(),该方法只返回栈顶元素,而不删除它。
入栈和出栈的实列图如下:
push(),pop()和peek()是栈的三个主要方法,但是栈还有其他方法和属性。如下:
clear():清除栈内的所有元素。
length(): 记录栈内元素的个数。
二:对栈的实现如下:
我们可以先实现栈类的方法开始;如下:
function Stack() { this.dataStore = []; this.top = 0; }
如上:dataStore 是保存栈内的所有元素。变量top记录栈顶的位置,初始化为0. 表示栈顶对应数组的起始位置为0,如果有元素被压入栈。该变量值将随之变化。
我们还有如下几个方法:push(), pop(), peek(),clear(),length();
1. push()方法;当向栈内压入一个新元素时,需要将其保存在数组中变量top所对应的位置,然后top值加1,让其指向数组中下一个位置。如下代码:
function push(element) { this.dataStore[this.top++] = element; }
function pop(){ return this.dataStore[--this.top]; }
function peek(){ return this.dataStore[this.top - 1]; }
function length(){ return this.top; }
function clear() {this.top = 0;
}
function Stack() { this.dataStore = []; this.top = 0; }Stack.prototype = { // 向栈中压入一个新元素 push: function(element) { this.dataStore[this.top++] = element; }, // 访问栈顶元素,栈顶元素永久的被删除了 pop: function(){ return this.dataStore[--this.top]; }, // 返回数组中的 top-1 个位置的元素,即栈顶元素 peek: function(){ return this.dataStore[this.top - 1]; }, // 栈内存储了多少个元素 length: function(){ return this.top; }, // 清空栈 clear: function(){ this.top = 0; } };
demo实例如下:
var stack = new Stack(); stack.push("a"); stack.push("b"); stack.push("c"); console.log(stack.length()); // 3 console.log(stack.peek()); // c
var popped = stack.pop(); console.log(popped); // c
console.log(stack.peek()); // b
stack.push("d");
console.log(stack.peek()); // d
stack.clear();
console.log(stack.length()); // 0
console.log(stack.peek()); // undefined
下面我们可以实现一个阶乘函数的递归定义;比如5!的阶乘 5!= 5 * 4 * 3 * 2 * 1;
如下代码:
function fact(n) { var s = new Stack(); while(n > 1) { s.push(n--); } var product = 1; while(s.length() > 0) { product *= s.pop(); } return product; } console.log(fact(5));
上面的代码含义是:先数字5传入函数,使用while循环,每次自减1的之前,把自己使用栈的函数push()压入栈内,直到变量n 小于 1为止。然后定义一个变量product;通过栈的length()的方法判断是否大于0 且每次执行 product* = s.pop(); pop()方法返回栈顶元素,且从栈中删掉该元素。所以每次执行一次,就删掉一个元素,直到s.length() <= 0 为止。所以 product = 5*4*3*2*1 .等操作。
本文向大家介绍JavaScript数据结构与算法之栈与队列,包括了JavaScript数据结构与算法之栈与队列的使用技巧和注意事项,需要的朋友参考一下 学习起因 曾经有一次在逛V2EX时,碰到这么一个帖子。 数学完全还给老师了,想学回一些基础数学,大概是高中程度的,有什么书籍推荐? 发帖的楼主大学没有高数课程,出去工作时一直在从事前端的工作。感觉到数学知识的匮乏,所以想补一补数学。 看了看帖子,感
本文向大家介绍Javascript数据结构与算法之列表详解,包括了Javascript数据结构与算法之列表详解的使用技巧和注意事项,需要的朋友参考一下 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候上学那段时间,每次考完试后,学校都会列出这次考试成绩前十名的同学的排名及成绩单,等等这些都是列
本文向大家介绍javascript数据结构与算法之检索算法,包括了javascript数据结构与算法之检索算法的使用技巧和注意事项,需要的朋友参考一下 查找数据有2种方式,顺序查找和二分查找。顺序查找适用于元素随机排列的列表。二分查找适用于元素已排序的列表。二分查找效率更高,但是必须是已经排好序的列表元素集合。 一:顺序查找 顺序查找是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的
包含了多种基于 JavaScript 的算法与数据结构。每种算法和数据结构都有自己的 README,包含相关说明和链接,以便进一步阅读 (还有 YouTube 视频) 。
栈(Stack) 是限定仅在 表尾 进行 插入和删除 操作的线性表。对前前端工程师来说日操作浏览后退前进 我们把允许插入和删除的一端为栈顶(top),另一端为栈底(bottom)。 栈又称为 后进先出 (Last In Firsot Out)的线性表,简称 LIFO 结构。 栈的实现 数组 - 顺序栈(内存地址连续性) 链表 - 链式栈 数组 - 顺序栈 用数组来一实现个栈 /** push(e
本文向大家介绍JavaScript数据结构与算法之队列原理与用法实例详解,包括了JavaScript数据结构与算法之队列原理与用法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript数据结构与算法之队列原理与用法。分享给大家供大家参考,具体如下: 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(