03-数据结构-双端队列

可以两端存取的数据结构


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;
      }

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值