初识数据结构与算法

初识数据结构与算法

1、栈stack

1、基本概念

  • 栈是一种遵从后进先出原则的有序集合
  • 添加新元素的一端叫做栈顶,另一端称为栈底
  • 操作栈的元素时,只能从栈顶操作(添加、移除或取值)

2、栈的实现

  • push:入栈方法
  • pop:出栈方法
  • top:获取栈顶
  • size:获取栈的元素个数
  • clear:清空栈
// push的实现
class Stack {
  constructor() {
    // 存储栈的数据
    this.data = {};
    // 记录栈的数据个数(相当于数组的 length)
    this.count = 0;
  }
  // push() 入栈方法
  push(item) {
    // 方式1:数组方法 push 添加
    // this.data.push(item)
    // 方式2:利用数组长度(性能优于push)
    // this.data[this.data.length] = item
    // 方式3:计数方式
    this.data[this.count] = item;
    // 入栈后,count 自增
    this.count++;
  }
}
// pop的实现
class Stack {
  constructor() {
    // 存储栈的数据
    this.data = {};
    // 记录栈的数据个数(相当于数组的 length)
    this.count = 0;
  }
	  // pop() 出栈方法
  pop() {
    // 出栈的前提是栈中存在元素,应先行检测
    if (this.isEmpty()) {
      console.log('栈为空!');
      return;
    }
    // 移除栈顶数据
    // 方式1:数组方法 pop 移除
    // return this.data.pop()
    // 方式2:计数方式
    const temp = this.data[this.count - 1];
    // delete this.data[--this.count];
    delete this.data[this.count - 1];
    this.count--;
    return temp;
  }
  // isEmpty() 检测栈是否为空(常用方法)
  isEmpty() {
    return this.count === 0;
  }
}
// delete 删除后会变为empty https://segmentfault.com/q/1010000040075299?utm_source=tag-newest
  // top() 用于获取栈顶值
  top() {
    if (this.isEmpty()) {
      console.log('栈为空!');
      return;
    }
    return this.data[this.count - 1];
  }
  // size() 获取元素个数
  size() {
    return this.count;
  }
  // clear() 清空栈
  clear() {
    this.data = [];
    this.count = 0;
  }

2、队列queue

1、基本概念

  • 队列遵从先进先出原则的有序集合
  • 添加新元素的一端称为队尾,另一端称为队

2、队列的实现

  • enqueue()入队方法
  • dequeue()出队方法
  • top()获取队首值
  • size()获取队列的元素个数
  • clear()清空队列

delete删除元素存在的问题:只是元素值被删除,元素所占据的空位依然存在,采用数组的shift实现

// 基于数组实现
class Queue {
  constructor() {
    // 用于存储队列数据
    this.queue = [];
    this.count = 0;
  }
  // 入队方法
  enQueue(item) {
    this.queue[this.count++] = item;
  }
  // 出队方法
  deQueue() {
    if (this.isEmpty()) {
      return;
    }
    // 删除 queue 的第一个元素
    // delete this.queue[0]
    // 利用 shift() 移除数组的第一个元素
    // 能做到值删除并且消除空位
    this.count--;
    return this.queue.shift();
  }
  isEmpty() {
    return this.count === 0;
  }
  // 获取队首元素值
  top() {
    if (this.isEmpty()) {
      return;
    }
    return this.queue[0];
  }
  size() {
    return this.count;
  }
  clear() {
    // this.queue = []
    // this.length实现将数组清空
    this.length = 0;
    this.count = 0;
  }
}

const q = new Queue();
// 基于对象的实现
class Queue {
  constructor() {
    this.queue = {};
    this.count = 0;
    // 用于记录队首的键
    this.head = 0;
  }
  // 入队方法
  enQueue(item) {
    this.queue[this.count++] = item;
  }
  // 出队方法
  deQueue() {
    if (this.isEmpty()) {
      return;
    }
    const headData = this.queue[this.head];
    delete this.queue[this.head];
    this.head++;
    this.count--;
    return headData;
  }
  isEmpty() {
    return this.count === 0;
  }
  clear() {
    this.queue = {};
    this.count = 0;
    this.head = 0;
  }
}

const q = new Queue();

3、双端队列

  • 允许同时从队首与队尾两端进行存取操作的队列,操作更加灵活。
  • 类似于数组,但是不允许在数组两端以外的位置进行存取操作
1、实现功能
  • addFront/addBack
  • removeFront/removeBack
  • frontTop/backTop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值