返回

用JS普通对象手写双端队列

前端

双端队列:一种灵活的数据结构

在计算机科学中,双端队列(也称为双端队列或双端链表)是一种强大的数据结构,支持在队列的两端(头部和尾部)进行插入和删除操作。与普通队列只能在队尾添加元素、队首删除元素不同,双端队列提供了更大的灵活性,允许从两端进行操作。

双端队列的应用

双端队列在各种应用中大放异彩,包括:

  • 图形学: 存储需要绘制的线条和形状。
  • 网络编程: 存储要发送或接收的数据包。
  • 操作系统: 存储正在运行的进程。

JavaScript 中双端队列的实现

我们可以使用 JavaScript 普通对象(键值对集合)来实现一个双端队列。以下是实现代码:

class Deque {
  constructor() {
    this.head = null;
    this.tail = null;
    this.length = 0;
  }

  addFront(element) {
    // 在队列头部添加元素
    const newNode = { element, next: this.head };
    if (this.isEmpty()) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      this.head.next = newNode;
      this.head = newNode;
    }
    this.length++;
  }

  addBack(element) {
    // 在队列尾部添加元素
    const newNode = { element, next: null };
    if (this.isEmpty()) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      this.tail.next = newNode;
      this.tail = newNode;
    }
    this.length++;
  }

  removeFront() {
    // 从队列头部移除元素
    if (this.isEmpty()) {
      return null;
    }
    const element = this.head.element;
    this.head = this.head.next;
    if (this.head === null) {
      this.tail = null;
    }
    this.length--;
    return element;
  }

  removeBack() {
    // 从队列尾部移除元素
    if (this.isEmpty()) {
      return null;
    }
    let current = this.head;
    let previous = null;
    while (current.next !== null) {
      previous = current;
      current = current.next;
    }
    const element = current.element;
    this.tail = previous;
    if (this.tail === null) {
      this.head = null;
    }
    this.length--;
    return element;
  }

  peekFront() {
    // 查看队列头部元素
    if (this.isEmpty()) {
      return null;
    }
    return this.head.element;
  }

  peekBack() {
    // 查看队列尾部元素
    if (this.isEmpty()) {
      return null;
    }
    return this.tail.element;
  }

  isEmpty() {
    // 检查队列是否为空
    return this.length === 0;
  }

  size() {
    // 返回队列大小
    return this.length;
  }

  print() {
    // 打印队列中的元素
    let current = this.head;
    while (current !== null) {
      console.log(current.element);
      current = current.next;
    }
  }
}

双端队列的使用示例

const deque = new Deque();

deque.addFront(1);
deque.addFront(2);
deque.addFront(3);

deque.addBack(4);
deque.addBack(5);
deque.addBack(6);

deque.print();

console.log(deque.peekFront()); // 3
console.log(deque.peekBack()); // 6

deque.removeFront();
deque.removeBack();

deque.print();

console.log(deque.size()); // 4

常见问题解答

1. 双端队列与普通队列有什么区别?

双端队列可以在两端进行插入和删除操作,而普通队列只能在队列尾部插入元素,在队列头部删除元素。

2. 双端队列有什么优点?

双端队列提供了比普通队列更大的灵活性,允许从两端进行操作,这在某些场景下非常有用,例如图形处理和网络编程。

3. 双端队列有哪些常见的应用?

双端队列用于存储需要绘制的形状和线条、需要发送或接收的数据包、正在运行的进程等。

4. 如何使用 JavaScript 实现双端队列?

可以使用 JavaScript 普通对象(键值对集合)来实现双端队列,上述代码提供了具体的实现细节。

5. 双端队列如何处理空队列情况?

双端队列在处理空队列时会返回 nullundefined,具体取决于实现方式。