初识数据结构与算法
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