数据结构-队列结构

146 阅读1分钟

学习数据结构和算法的第二天,学习了数据结构中的队列。
相较于栈来说,队列同样也是一种受控的线性数据结构,但是与栈结构不同的是,队列是先进先出(frist in first out),只能由队尾进入,队首顶出,实际生活中类似于排队购票。
在数据结构中队列分为一般队列和优先级队列,即无排序队列和有排序队列,类似于机场购票中的普通通道和vip通道。

封装一般队列:
class Queue {
  // 属性
  items = [];

  // 方法
  // 元素插入队列
  enqueue(element) {
    this.items.push(element);
  }
  // 移除队列元素
  dequeue() {
    return this.items.shift();
  }
  // 返回队首元素
  front() {
    return this.items[0];
  }
  // 队列是否为空
  isEmpty() {
    return this.items.length == 0;
  }
  // 队列元素数量
  size() {
    return this.items.length;
  }
  // 转string
  toString() {
    return this.items.map((item) => String(item)).join();
  }
}

这里同样是使用了数组来模拟一般队列的实现

实际应用:击鼓传花
const nameList = ["小明", "小红", "小曾", "小李"];
const num = 3;
const passGames = (nameList, num) => {
        const queue = new Queue(); // 此处的Queue类是上文的模拟队列
        nameList.forEach((element, index, array) => {
          queue.enqueue(element);
        });

        while (queue.size() > 1) {
          for (let i = 0; i < num - 1; i++) {
            queue.enqueue(queue.dequeue());
          }
          queue.dequeue();
        }
        return nameList.indexOf(queue.front());
      };
passGames(nameList, num);

面试时比较常考的题目 可以用队列来实现

优先级队列的实现:
// 优先级队列
class PriorityQueue {
  items = [];
  constructor(element, priority) {
    this.element = element;
    this.priority = priority;
  }
  // 优先级队列插入
  enqueue(element, priority) {
    const queueElement = new PriorityQueue(element, priority);
    if (this.items.isEmpty()) {
      this.items.push(element);
    } else {
      let isInsert = false; // 判断是否已插入
      for (let i = 0; i < this.items.length; i++) {
        if (queueElement.priority < this.items[i].priority) {
          this.items.splice(i, 0, queueElement);
          isInsert = true;
        }
        if (!isInsert) {
          this.items.push(element);
        }
      }
    }
  }
}

优先级队列的插入需要判断数据的优先级并对数据进行排序,其余的操作都和一般队列一样。