返回

JavaScript 中的栈与队列:基础与应用

前端

栈:后进先出

栈是一种后进先出(FILO)的数据结构,这意味着最近添加的元素将首先被移除。就像一叠盘子,你只能从栈顶添加或移除盘子。

栈的实现

class Stack {
  constructor() {
    this.items = [];
  }

  push(item) {
    this.items.push(item);
  }

  pop() {
    return this.items.pop();
  }

  peek() {
    return this.items[this.items.length - 1];
  }

  isEmpty() {
    return this.items.length === 0;
  }
}

栈的应用

  • 后缀表达式求值: 后缀表达式是一种数学表达式,其中运算符写在操作数之后。例如,表达式 1 2 + 在后缀表达式中表示为 1 2 +。可以使用栈来计算后缀表达式。
  • 函数调用: 当函数被调用时,函数的参数被压入栈中。当函数返回时,函数的参数被弹出栈。
  • 内存管理: 栈也被用于内存管理。当一个函数被调用时,函数的局部变量被压入栈中。当函数返回时,函数的局部变量被弹出栈。

队列:先进先出

队列是一种先进先出(FIFO)的数据结构,这意味着最早添加的元素将首先被移除。就像一个队列,你只能从队列的一端添加元素,从另一端移除元素。

队列的实现

class Queue {
  constructor() {
    this.items = [];
  }

  enqueue(item) {
    this.items.push(item);
  }

  dequeue() {
    return this.items.shift();
  }

  peek() {
    return this.items[0];
  }

  isEmpty() {
    return this.items.length === 0;
  }
}

队列的应用

  • 任务调度: 队列可以用于任务调度。当一个新任务到达时,它被添加到队列中。当一个工作进程空闲时,它从队列中获取一个任务并开始执行。
  • 消息传递: 队列可以用于消息传递。当一个进程需要向另一个进程发送消息时,它将消息放入队列中。当接收进程空闲时,它从队列中获取消息并处理它。
  • 文件系统: 队列可以用于文件系统。当一个进程需要读写一个文件时,它将文件打开并将其放入队列中。当操作系统空闲时,它从队列中获取一个文件并对其进行读写操作。

总结

栈和队列都是基本的数据结构,它们在编程中有着广泛的应用。栈遵循先进后出(FILO)的原则,而队列遵循先进先出 (FIFO) 的原则。希望本文能帮助读者理解栈和队列的概念、实现方法以及在 JavaScript 中的应用。