js实现数据结构(一)实现一个栈类(ES5和ES6两种方式)

本文介绍了如何使用ES5和ES6两种方式实现数据结构中的栈类,遵循后进先出(LIFO)原则。详细阐述了栈的基本操作,包括push、pop、peek和size方法,并探讨了ES5与ES6实现的区别以及在内存和访问控制上的考量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


栈是一种遵从**后进先出(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值