二、栈
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。
由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访问。为了得到栈底的元 素,必须先拿掉上面的元素。
对栈的两种主要操作是将一个元素压入栈和将一个元素弹出栈。入栈使用 push() 方法,出 栈使用 pop() 方法(调用了pop方法后,栈顶元素也从栈中被永久性地删除了),想要预览栈顶元素可以使用peek()方法,该方法只会返回栈顶元素,而不会删除它。
// 定义一个push方法 function push(element) { this.dataStore[this.stackSize++] = element; return this; // 此处return this,等于retern的是实例对象,以便后面链式操作 } function pop() { this.stackSize--; // 数组里的元素弹出后,栈的长度应该对应-1 return this.dataStore.pop(); // 操作数组,弹出并删除栈顶元素 } function peek() { return this.dataStore[this.stackSize-1]; // 返回栈顶元素 } function clear() { this.stackSize = 0; // 同时让栈大小等于0 this.dataStore = []; // 清空栈元素 } function Stack() { this.stackSize = 0; this.dataStore = []; this.pop = pop; this.push = push; this.peek = peek; this.clear = clear; } const s = new Stack(); s.push(1).push(2).push(3).push(4).push(5); // 链式调用,每调用一次返回的还是s这个实例对象 console.log(s); /* 返回值 Stack { stackSize: 5, dataStore: [ 1, 2, 3, 4, 5 ], pop: [Function: pop], push: [Function: push], peek: [Function: peek] } * */ let p = s.pop(); console.log(p); // 5 console.log(s); /* 返回值 Stack { stackSize: 4, dataStore: [ 1, 2, 3, 4], pop: [Function: pop], push: [Function: push], peek: [Function: peek] } * */ let k = s.peek(); console.log(k); // 4 console.log(s); /* 返回值 Stack { stackSize: 4, dataStore: [ 1, 2, 3, 4], pop: [Function: pop], push: [Function: push], peek: [Function: peek] } * */ s.clear(); console.log(s); /* 返回值 Stack { stackSize: 0, dataStore: [], pop: [Function: pop], push: [Function: push], peek: [Function: peek] } * */