二、栈
1、名词解释
栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
2、创建栈
因为JavaScript没有栈结构,我们创建一个类来模拟栈。
设定栈的名字为Stack,栈中的数据保存在数组arr中。
let arr = []; function Stack() { }
栈中的方法:
1)push(eles):添加一个或多个元素
2)pop():移除栈顶元素,同时返回被移除元素。
3)peek(num):根据参数返回栈顶元素(1)或栈底元素(0)
4)isEmpty():判读栈内是否为空。
5)clear():移除栈里的所有元素
6)size():返回栈里元素的个数
7)print():在控制台输出栈里的元素
8)indexOf(): 查找元素是否在栈中,如果存在返回下标,不存在返回false
2.1、push方法实现
this.push = function () { //向栈内添加数据 let ele = arguments; if (ele){ for(let i=0;i<ele.length;i++){ arr.push(ele[i]); } } };
2.2、pop方法实现
this.pop = function () { return arr.pop(); }
2.3、peek方法实现
this.peek = function (num) { if(num === 0){ return arr[0]; }else if(num === 1){ return arr[arr.length - 1]; } console.log('Please enter 0 or 1 !'); }
2.4、isEmpty方法实现
this.isEmpty = function () { return arr.length == 0; };
2.5、clear方法实现
this.clear = function(){ arr = []; };
2.6、size方法实现
this.size = function () { return arr.length; };
2.7、print方法实现
this.print = function () { console.log(arr.toString()); }
2.8、indexOf方法实现
this.indexOf = function (ele) { return arr.indexOf(ele) != -1 ? arr.indexOf(ele) : false; }
3、使用Stack
let stack = new Stack(); console.log('isEmpty', stack.isEmpty()); // isEmpty true stack.push(1,2,3,4,5); //add Stack console.log('size',stack.size()); // size 5 stack.print() //1,2,3,4,5 stack.pop() stack.print() //1,2,3,4 console.log('indexOf', stack.indexOf(2)) //indexOf 1
4、改进代码:使用class、WeakMap
let Stack = (function() {
const arr = new WeakMap();
class Stack {
constructor() {
arr.set(this, []);
};
push() {
let a = arr.get(this) //向栈内添加数据
let ele = arguments;
if (ele) {
for (let i = 0; i < ele.length; i++) {
a.push(ele[i]);
}
}
};
pop() {
let a = arr.get(this)
return a.pop();
};
peek(num) {
let a = arr.get(this)
if (num === 0) {
return a[0];
} else if (num === 1) {
return a[a.length - 1];
}
console.log('Please enter 0 or 1 !');
};
isEmpty() {
let a = arr.get(this)
return a.length == 0;
};
clear() {
let a = arr.get(this)
a = [];
};
size() {
let a = arr.get(this)
return a.length;
};
print() {
let a = arr.get(this)
console.log(a.toString());
}
indexOf(ele) {
let a = arr.get(this)
return a.indexOf(ele) != -1 ? a.indexOf(ele) : false;
}
};
return Stack;
})()

浙公网安备 33010602011771号