基本的数据结构 - 双端队列
双端队列的概念特点
- 有序集合;
- 受限的线性结构;
- 可以从前、后端同时添加、删除元素。
双端队列常用的方法
- addFront(element): 添加新元素到队列前端
- addBack(element): 添加新元素到队列后端
- peekFront():查看前端元素
- peekBack(): 查看后端元素
- removeFront(): 删除前端元素
- removeBack(): 删除后端元素
- isEmpty(): 判断是否为空
- size(): 获取队列大小
- toString():toString方法
双端队列的实现
基于数组实现队列的常用方法
export function DoubleEndedQueue(){
//属性
this.items = [];
//方法
// 从前端添加元素
DoubleEndedQueue.prototype.addFront = function (element) {
this.items.unshift(element);
}
// 从后端添加元素
DoubleEndedQueue.prototype.addBack = function (element) {
this.items.push(element);
}
// 查看前端元素
DoubleEndedQueue.prototype.peekFront = function (element) {
return this.items[0];
}
// 查看后端元素
DoubleEndedQueue.prototype.peekBack = function (element) {
return this.items[items.length - 1];
}
// 删除前端元素
DoubleEndedQueue.prototype.removeFront = function (element) {
return this.items.shift();
}
// 删除后端元素
DoubleEndedQueue.prototype.removeBack = function (element) {
return this.items.pop();
}
// 判断队列是否为空
DoubleEndedQueue.prototype.isEmpty = function (element) {
return this.items.length === 0;
}
// 获取队列大小
DoubleEndedQueue.prototype.size = function (element) {
return this.items.length;
}
// toString方法
DoubleEndedQueue.prototype.toString = function (element) {
var resultString = "";
for (var i = 0; i < this.items.length; i++) {
resultString += this.items[i] + "";
}
return resultString;
}
}
双端队列的应用
回文检查器:回文是正反都能读通的单词、词组、数或一系列字符的序列,例如 madam或者racecar.
import { DoubleEndedQueue } from './CreateDoubleEndedQueue.js';
const Palindrome = (params) => {
// 1. 创建一个双向队列
const doubleEndedQueue = new DoubleEndedQueue();
// 2. 首先需要判断参数时候合法
if(params === undefined || params === null || (params !== null && params.length === 0)){
return false;
}
// 3. 统一大小写,去除空格
const lowerStr = params.toLocaleLowerCase().split(' ').join('');
let isEqual = true;
let firstChar,lastChar;
// 4. 将字符串添中每一个字符按顺序添加到队列中
for(let i = 0;i < lowerStr.length;i++){
doubleEndedQueue.addBack(lowerStr.charAt(i))
}
while(doubleEndedQueue.size() > 1 && isEqual){
firstChar = doubleEndedQueue.removeFront();
lastChar = doubleEndedQueue.removeBack();
if(firstChar !== lastChar){
isEqual = false;
}
}
console.log(isEqual);
return isEqual;
}
Palindrome("Step on no pets");