二、栈
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。栈被称为一种后入先出(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] }
* */