可以两端存取的数据结构
export class Dequeue {
private count: number; // 数据的最末尾
private lowestCount: number; // 数据的首端
private obj: object; // 存储
// 初始化
constructor() {
this.count = 0;
this.lowestCount = 0;
this.obj = {};
}
// 向队列末尾添加数据
addEnd<T>(param: T) {
this.obj[this.count] = param;
this.count++;
}
// 从队列末尾推出数据
removeEnd() {
const res = this.obj[this.count - 1];
delete this.obj[this.count - 1];
this.count--;
return res;
}
// 向队列前端添加数据
/**
* 1. 如果当前队列为空,直接调用addEnd
* 2. 当前队列不为空,但是lowestCount>0的情况
* 3. 当前队列不为空,但是lowestCount<=0
*/
addFront<T>(param: T) {
if (this.isEmpty()) {
this.addEnd<T>(param);
} else if (this.lowestCount > 0) {
this.lowestCount--;
this.obj[this.lowestCount] = param;
} else {
for (let i = this.count; i > 0; i--) {
this.obj[i] = this.obj[i - 1]; // 将数据的key整体上移
}
this.obj[this.lowestCount] = param;
}
}
// 从队列前端移出数据
removeFront() {
if (this.isEmpty()) {
return;
}
const res = this.obj[this.lowestCount]; // 保存当前队列首项,方便返回
delete this.obj[this.lowestCount]; // 删除当前队列首项
this.lowestCount++; // 首项的key+1
return res;
}
// 当前队列size
size() {
return this.count - this.lowestCount;
}
// 当前队列是否为空
isEmpty() {
return this.size() === 0;
}
// 返回当前队列中全部数据组成的字符串
toString() {
if (this.isEmpty()) return "";
let str = "";
for (let key in this.obj) {
if (typeof this.obj[key] !== "object") {
str += `${this.obj[key]},`;
} else {
str += `${JSON.stringify(this.obj[key])},`;
}
}
str = str.slice(0, -1);
return str;
}
}
应用场景:判断是否是回文 回文是正反都一样的特殊文本
function checkPalindrome(paramStr) {
// 边界判断 如果没传参数或传入非字符串类型的数据return
if (
paramStr === undefined ||
paramStr === null ||
(typeof paramStr === "string" && paramStr.length === 0)
) {
return false;
}
// 将字符串进行处理 整体转为大写
const str = paramStr.replace(" ", "").toUpperCase();
// 使用双端队列来处理这个问题
const dequeue = new Dequeue();
// 用于判断是否是回文
let isCheck = true;
let first, end;
// 先将传入的字符串都存到队列中
for (let i = 0; i < paramStr.length; i++) {
dequeue.addEnd(paramStr[i]);
}
// 开始比较 dequeue.size() > 1 如果传入的参数长度为1,那一定是回文
while (dequeue.size() > 1 && isCheck) {
first = dequeue.removeFront(); // 拿出第一个和最后一个进行比较
end = dequeue.removeEnd();
if (first !== end) {
isCheck = false;
}
}
return isCheck;
}