数据结构(二)队列
队列是一个先进先出的数据结构
JavaScript中没有队列,但可以用Array实现队列的所有功能
队列常用操作:push、shift、queue[0]
1. 队列定义
先进先出(排队)
队列在尾部添加新元素,并从顶部移除元素
最新添加的元素必须排在队列的末尾
用途:
食堂排队打饭
JS异步中的任务队列
计算最近请求次数
……
2. 队列具体操作
创建
1 |
|
方法
enqueue(element(s)):向队列尾部添加一个(或多个)新的项
1
2
3
4enqueue(element(s)) {
this.items[this.count] = element;
this.count++;
}dequeue():移除队列的第一项,并返回被移除的元素
1
2
3
4
5
6
7
8
9dequeue() {
if(this.isEmpty()) {
return undefined;
}
const result = this.items[this.lowestCount];
delete this.items[this.lowestCount];
this.lowestCount++;
return result;
}peek():返回队列中第一个元素,也将是最先被移除的元素(不移除元素,只返回元素信息)
1
2
3
4
5
6peek() {
if(this.isEmpty()) {
return undefined;
}
return this.items[this.lowestCount];
}isEmpty():如果队列中不包含任何元素,返回 true,否则返回 false
1
2
3
4isEmpty() {
return this.count - this.lowestCount === 0;
//return this.size() === 0;
}size():返回队列包含的元素个数,与数组的length属性类似
1
2
3size() {
return this.count - this.lowestCount;
}clear(): 清空所有元素
1
2
3
4
5clear() {
this.items = {};
this.count = 0;
this.lowestCount = 0;
}toString():
1
2
3
4
5
6
7
8
9
10toString() {
if (this.isEmpty()) {
return '';
}
let objString = `${this.items[this.lowestCount]}`; //模板字符串
for (let i = this.lowestCount + 1; i < this.count; i++){
objString = `${objString},${this.items[i]}`;
}
return objString;
}由于Queue 类中的第一个索引值不一定为0,所以从索引值为lowestCount 的位置开始迭代队列
3.queue类使用
同stack
4. 双端队列定义
先进先出 + 后进先出
前后都能进行添加和移除元素的特殊队列
应用:
撤销操作
5. 双端队列的具体操作
创建
1 |
|
方法
和queue相同的: isEmpty
、clear
、size
、toString
和queue不同的:
addFront(element):在前端添加新的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15addFront(element) {
if (this.isEmpty()) { //为空时,直接添加到双端队列的后面
this.addBack(element);
} else if (this.lowestCount > 0) { //有一个元素从前端移除了,把新元素放到这个位置
this.lowestCount--;
this.items[this.lowestCount] = element;
} else {
for (let i = this.count; i > 0; i--) {
this.items[i] = this.items[i - 1]; //往后挪一个位置
}
this.count++;
this.lowestCount = 0;
this.items[0] = element;
}
}addBack(element):在后端添加新的元素(和enqueue()相同)
1
2
3
4addBack(element) {
this.items[this.count] = element;
this.count++;
}removeFront():从前端移除第一个元素(和dequeue 方法相同)
1
2
3
4
5
6
7
8
9removeFront() {
if(this.isEmpty()) {
return undefined;
}
const result = this.items[this.lowestCount];
delete this.items[this.lowestCount];
this.lowestCount++;
return result;
}removeBack():从后端移除第一个元素(和Stack 类中的pop 相同)
1
2
3removeBack() {
return this.items.pop();
}peekFront():返回前端的第一个元素(和peek方法相同)
1
2
3peekFront() {
return this.items[this.items.length - 1];
}peekBack():返回后端的第一个元素(和Stack 类中的peek方法相同)
1
2
3peekBack() {
return this.items[this.items.length - 1];
}
6. Deque类使用
同上
7. 解决问题
循环队列
1 |
|
回文
1 |
|
一道LeetCode题
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!