js版数据结构_02队列
代码均经过测试,但小白太白难免不足
在本篇博文你可以了解到
- 队列是什么东西
- 双端队列
队列和栈是十分相似的,只不过栈的特点是先进后出,而队列的是先进先出
1 队列是什么
队列是遵循先进先出(FIFO)原则的一组有序的项,它的操作可以在两端进行。即:队尾进,对头出
写在前面: 未完善哦,像私有成员变量的这种仿照第一节。毕竟我们要先学会思想
创建这个队列的类吧
class Queue{
constructor(){
this.count=0;//用于记录队列内的元素个数
this.lowesCount=0;//用于追踪对头元素
this.items={};//用于存储队列元素的数据结构,当然也可以使用数组,但是使用对象获取元素更加高效
}
}
我们要实现的方法:
- enqueue(e)向队尾添加元素
- dequeue() 从对头出去一个元素
- peek()返回队列中的第一个元素,也即:返回对头元素
- isEmpty()判空
- size()返回队列中元素的个数
- clear() 清空
判空
ps:指针的作用就是指向了我们所需要的那块内存的元素,不要拘泥于c中的指针结构。它就是一个方便我们拿取东西的玩意儿
isEmpty() {
// 什么时候为空呢,这里希望你有写c的数据结构的基础,为空时队头队尾指针指向同一地方
return this.count === this.lowesCount;
}
入队出队:
enqueue(e) {
this.items[this.count] = e;
this.count++
}
dequeue() {
// 先判非空
if (this.isEmpty()) {
return undefined;
} else {
const result = this.items[this.lowesCount];
delete this.items[this.lowesCount];
// 指针后移
this.lowesCount++;
return result;
}
}
其他三个:
peek() {
// 先判空
if (this.isEmpty()) {
return undefined;
} else {
return this.count[this.lowesCount];
}
}
size(){
// 你要搞清楚有元素时这个this.count是指向的队尾的后一个,放的时候可是先放,再让它加的1
return this.count-this.lowesCount;
}
clear(){
this.items={};
this.count=0;
this.lowesCount=0;
}
2 双端队列
什么是双端队列呢:即我们也希望在队头添加元素,队尾移出元素。
拿生活举栗子吧:
排队买东西时,队头的人买完之后忘记拿东西,就可以直接回到队头的位置去取。同样队尾的人等的不耐烦了,也可以离开
在计算机科学中,双端队列的一个常见应用是存储一系列的撤销操作。每当用户在软件中进
行了一个操作,该操作会被存在一个双端队列中(就像在一个栈里)。当用户点击撤销按钮时,
该操作会被从双端队列中弹出,表示它被从后面移除了。在进行了预先定义的一定数量的操作后,
最先进行的操作会被从双端队列的前端移除。由于双端队列同时遵守了先进先出和后进先出原
则,可以说它是把队列和栈相结合的一种数据结构
实操
创建这个类
class Deque {
constructor() {
this.count = 0;
this.lowestCount = 0;
this.items = {};
}
}
同样我们要实现以下功能:
- isEmpty
- clear
- size
- addFront(e) 队头添加元素
- addBack(e) 队尾添加元素
- removeFront 队头移出元素
- removeBack 队尾移出元素
- peekFront 取队头元素
- peekBack 取队尾元素
实现代码(主要代码):
队头出队尾进,上面我们已经写好了。只需改个名字就行
addFront(e) {
if (this.isEmpty()) {
this.addBack(e)
} else {
// 搞清楚现在谁指着队头呢
this.lowesCount--;
this.items[this.lowesCount] = e;
}
}
addBack(e) {
this.items[this.count] = e;
this.count++
}
removeFront() {
// 先判非空
if (this.isEmpty()) {
return undefined;
} else {
const result = this.items[this.lowesCount];
delete this.items[this.lowesCount];
// 指针后移
this.lowesCount++;
return result;
}
}
removeBack() {
if (this.isEmpty()) {
return undefined;
} else {
// 谁指向队尾呢,this.count指向的是队尾的下一个
let result = this.items[this.count - 1];
delete this.items[this.count - 1];
this.count--;
return result;
}