二、栈

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;
})()

 

  

 

posted @ 2018-12-03 18:33  道鼎金刚  阅读(119)  评论(0)    收藏  举报