JavaScript数据结构与算法之栈详解
在博客介绍了下列表,列表是最简单的一种结构,如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似更复杂的数据结构---栈。栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现。
一对栈的操作。
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端陈为栈顶。比如餐馆里面洗盘子,只能先洗最上面的盘子,盘子洗完后,也只能螺到这一摞盘子的最上面。栈被称为 "后入先出"(LIFO)的数据结构。
由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访问,为了得到栈低的元素,必须先拿掉上面的元素。我们可以对栈的两种主要操作是将一个元素 压入栈 和 将一个元素 弹出栈。入栈我们可以使用方法push()方法,出栈我们使用pop()方法。pop()方法虽然可以访问栈顶的元素,调用该方法后,栈顶元素也就从栈中被永久性的删除了。另一个我们很常用的方法是peek(),该方法只返回栈顶元素,而不删除它。
入栈和出栈的实列图如下
push(),pop()和peek()是栈的三个主要方法,栈还有其他方法和属性。如下
clear()清除栈内的所有元素。
length(): 记录栈内元素的个数。
二对栈的实现如下
我们可以先实现栈类的方法开始;如下
function Stack() {
this.dataStore = [];
this. = 0;
}
如上dataStore 是保存栈内的所有元素。变量记录栈顶的位置,初始化为0. 表示栈顶对应数组的起始位置为0,如果有元素被压入栈。该变量值将随之变化。
我们还有如下几个方法push(), pop(), peek(),clear(),length();
1. push()方法;当向栈内压入一个新元素时,需要将其保存在数组中变量所对应的位置,然后值加1,让其指向数组中下一个位置。如下代码
function push(element) {
this.dataStore[this.++] = element;
}
2. pop()方法与push()方法相反---它返回栈顶元素,将值减1.如下代码
function pop(){
return this.dataStore[--this.];
}
3. peek()方法返回数组的第-1个位置的元素,即栈顶元素;
function peek(){
return this.dataStore[this. - 1];
}
4. length()方法 有时候我们要知道栈内有多少个元素,我们可以通过返回变量值的方式返回栈内的元素个数,如下代码
function length(){
return this.;
}
5. clear(); 有时候我们要清空栈,我们将变量值设为0;如下代码
function clear() {
this. = 0;
}
如下所有代码
function Stack() {
this.dataStore = [];
this. = 0;
}
Stack.prototype = {
// 向栈中压入一个新元素
push: function(element) {
this.dataStore[this.++] = element;
},
// 访问栈顶元素,栈顶元素永久的被删除了
pop: function(){
return this.dataStore[--this.];
},
// 返回数组中的 -1 个位置的元素,即栈顶元素
peek: function(){
return this.dataStore[this. - 1];
},
// 栈内存储了多少个元素
length: function(){
return this.;
},
// 清空栈
clear: function(){
this. = 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
狼蚁网站SEO优化我们可以实现一个阶乘函数的递归定义;比如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 = 54321 .等操作。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程