现实生活中栈的一个例子是佩兹糖果盒。想象一下你有一盒佩兹糖果,里面塞满了红色、黄色和白色的糖果,但是你不喜欢黄色的糖果。使用栈(有可能用到多个栈)写一段程序,在不改变盒内其他糖果叠放顺序的基础上,将黄色糖果移出。
看到这个问题后,你的第一个想法是什么?
其实,仔细分析,这个问题的思路还是比较清晰的,无非就是:
1、用一个栈存放我本来的糖果;
//糖的数量
var num=20;
//创建糖盒
var box = new Stack();
//糖的数组
var sugars=['红','黄','白'];
//根据数量创建糖,并且放到糖盒
for(var i=0;i<num;i++){
var random = Math.floor(Math.random()*3);
box.push(sugars[random]);
}
2、遍历出糖果,将从栈中筛选出黄色糖果;
3、将筛选出来的糖果,放到另一个栈中;
//糖的缓存
var buffer = new Stack();
box.forEach(function (sugar) {
if(sugar!='黄'){
buffer.push(sugar);
}
})
4、由于不能改变糖果叠放次序,所以,将我之前的栈清空,将第二栈中的数据遍历回第一个栈。
//清空栈内的数据
box.clear();
//遍历未筛选糖
buffer.forEach(function (sugar) {
box.push(sugar);
})
console.log("*************************************");
//遍历筛选后的糖
box.forEach(function (sugar) {
console.log(sugar);
})
在解决这个问题前,把我们需要用的栈的基本方法简单例举如下:
这里说明一下dataStore是申明的数组this.dataStore=[ ]
(1)进栈
this.push = function (data) {
//获得当前下标
var index = this.dataStore.length;
//添加数据
this.dataStore[index] = data;
// this.dataStore.push(data);
}
(2)出栈
this.pop = function () {
return this.dataStore.pop();
}
(3)清空
this.clear = function () {
delete this.dataStore;
this.dataStore = [];
}
(4)遍历
this.forEach = function (call) {
var length = this.dataStore.length;
for (var i = length - 1; i >= 0; i--) {
call(this.dataStore[i]);
}
}
前面我们已经梳理过佩兹糖果盒的步骤,现在我简单将下面代码解释一下:
box就是之前所说的装糖果的第一个栈,buffer是暂存删除后糖果的第二个栈,其他的想必也不用我多说了。
//糖的数量
var num=20;
//创建糖盒
var box = new Stack();
//糖的数组
var sugars=['红','黄','白'];
//根据数量创建糖,并且放到糖盒
for(var i=0;i<num;i++){
var random = Math.floor(Math.random()*3);
box.push(sugars[random]);
}
//糖的顺序
box.forEach(function (sugar) {
console.log(sugar);
})
//糖的缓存
var buffer = new Stack();
box.forEach(function (sugar) {
if(sugar!='黄'){
buffer.push(sugar);
}
})
//清空栈内的数据
box.clear();
//遍历未筛选糖
buffer.forEach(function (sugar) {
box.push(sugar);
})
console.log("*************************************");
//遍历筛选后的糖
box.forEach(function (sugar) {
console.log(sugar);
})