栈是一种遵从**后进先出(LIFO)**原则的有序集合。新添加的或待删除的元素都保存在栈的 同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
1.ES5方法实现“栈”类
我们将创建一个类来表示栈。先声明这个类的构造函数:
function Stack() {
//各种属性和方法的声明
}
然后,我们需要一种数据结构来保存栈里的元素。可以选择数组:
this.dataStore = [];
接下来,要为我们的栈声明一些方法。
top
:指针,指向栈顶(和数组的length相等,所以arr[top]
没有元素)。
push(element(s))
:添加一个(或几个)新元素到栈顶。
pop()
:移除栈顶的元素,同时返回被移除的元素。
peek()
:返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返 回它)。
size()
:返回栈里的元素个数。这个方法和数组的length属性很类似。
注意:
1,这些方法在构造函数外定义可以避免每次实例化的时候方法的重新声明,减少占用内存,
2,在这些方法里,使用this指针是可以访问到构造函数里面的变量的,因为this在实例化的时候,就指向了实例化的新对象,通过新对象调用这些方法的时候,this也会指向这个新对象
ES5实现一个栈类:
function Stack() {
this.dataStore = []; //数组 dataStore 保存栈内元素
this.top = 0; //变量 top 记录 栈顶位置,被构造函数初始化为 0
this.size = size; //栈的长度
this.push = push; //定义方法
this.pop = pop;
this.peek = peek;
this.clear = clear;
}
/**
*向栈中压入一个新元素
*先把item放入top指向的位置,再top+1
* @param {*} item
*/
function push(item) {
this.dataStore.push(item);//使用this指针是可以访问到构造函数里面的变量的
this.top++;
}
/**
*删除栈顶元素,并返回它
*先top-1,再返回这个值
* @returns
*/
function pop() {
this.top--;
return this.dataStore.pop();
}
/**
*返回栈顶元素,不删除
*top不改变
* @returns
*/
function peek() {
return this.dataStore[this.top - 1];
}
/**
*返回栈元素个数
* @returns
*/
function size() {
return this.top;
}
/**
*清空一个栈
*/
function clear() {
this.dataStore = [];
}
//实例化这个类,
var stack = new Stack();
//测试实例
stack.push(5);
stack.push(8);
console.log(stack.peek());
stack.push(11);
console.log(stack.size());
2.ES6方法实现“栈”类
用ES6的简化语法把Stack函数转换成Stack类。
这种方法在类里面声明变量,只能在类的构造函数constructor里声明, 在类的其他函数里用this.nameofVariable
就可以引用这个变量。
class Stack {
constructor() {
this.dataStore = []; //{2}
this.top = 0;
}
//Stack方法
push(item) {
this.dataStore.push(item);
this.top++;
// this.dataStore[this.top++] = item;
}
pop() {
// return this.dataStore[--this.top];
this.top--;
return this.dataStore.pop();
}
peek() {
// return this.dataStore[this.top - 1];
return this.dataStore[this.top - 1];
}
size() {
return this.top;
}
clear() {
this.dataStore = [];
}
}
ES6的类是基于原型的。虽然基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,却不能够声明私有属性(变量) 或方法。
而且,在这种情况下,我们希望Stack类的用户只能访问暴露给类的方法。否则,就有 可能从栈的中间移除元素(因为我们用数组来存储其值),这不是我们希望看到的。
JavaScript实现私有属性:https://www.cnblogs.com/ihardcoder/p/4914938.html