按照自学进度,目前看到了《javascript高级程序》的第五章引用类型。我们知道编程的核心就是由数据结构及算法组成的。而这一章里讲到了非常有用的栈方法及队列方法。我想小结一下。
数组可以表现得像栈一样,可以限制插入和删除项的一种数据结构。栈是一种后进先出的数据结构,也就是最新添加的项最早被移除。而栈中项的插入(叫做推入)和移除(叫做弹出)只发生在一个位置——栈的顶部。ECMAscript为数组专门提供了push()和pop()方法,以便实现类似栈的行为。
push()方法可以接受任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度。
pop()方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。看例子:
<span style="font-size:18px;">var colors=new Array(); //创建一个数组
var count=colors.push("red","green"); //推入两项
alert(count); //2
count=colors.push("black"); //推入另一项
alert(count); //3
var item=colors.pop(); //取得最后一项
alert(item); //"black"
alert(colors.length); //2</span>
以上代码中的数组可以看成是栈(代码本身没有任何区别,而push()和pop()都是数组默认的方法)。首先,我们使用push()将两个字符串推入数组的末尾,并将返回的结果保存在变量count中(值为2)。然后再推入一个值,而结果仍然保存在count中。因为此时数组中包含3项,所以push()返回3,在调用pop()时,它会返回数组的最后一项,即字符串"black"。此后,数组中仅剩两项。
<span style="font-size:18px;"> var colors={"red","blue"};
colors.push("brown"); //添加另一项
colors[3]="black"; //添加一项
alert(colors.length); //4
var item=colors.pop(); //取得最后一项
alert(item); //"black"</span>
再来说说队列数据结构的访问规则是先进先出。队列在列表的末端添加项,从列表的前端移除项。由于push()是向数组末端添加项的方法,因此要模拟队列只需一个从数组前端取得项的方法。实现这一操作的数组方法就是shift(),它能够解除数组中的第一个项并返回该项,同时将数组长度减1.结合使用shift()和push()方法,可以使用 shift()和push()方法,可以像使用队列一样使用数组。
<span style="font-size:18px;">var colors=new Array(); //创建一个数组
var count=colors.push("red","green"); //推入两项
alert(count); //2
count=colors.push("black"); //推入另一项
alert(count); //3
var item=colors.shift(); //取得第一项
alert(item); //"red"
alert(colors.length); //2</span>
ECMAScript还为数组提供了一个unshift()方法。unshift()与shift()方法的用途相反:它能在数组前端添加任意个项并返回新数组的长度。因此,同时使用unshift()和pop()方法,可以从相反的方向来模拟队列,即在数组的前端添加项,从数组的末端移除项。
<span style="font-size:18px;">var colors=new Array(); //创建一个数组
var count=colors.unshift("red","green"); //推入两项
alert(count); //2
count=colors.unshift("black"); //推入另一项
alert(count); //3
var item=colors.pop();
alert(item); //"green" //取得最后一项
alert(colors.length); //2</span>
总结:
用
push()和pop()方法,实现类似栈的行为(后进先出),而队列的行为可以用两种搭配来实现。(1)用shift()和push()方法来实现队列的行为(先进先出),从末端进从前端出。(2)用unshift()和pop()方法,可以从相反的方向来模拟队列,即从前端进,从末端出。