当前位置:首页 > JavaScript

js栈实现

2026-02-01 07:30:45JavaScript

栈的基本概念

栈是一种遵循后进先出(LIFO)原则的数据结构,仅允许在栈顶进行插入(压栈)和删除(弹栈)操作。JavaScript中可通过数组或链表实现栈。

基于数组的栈实现

利用数组的push()pop()方法可高效模拟栈操作:

js栈实现

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

  // 压栈
  push(element) {
    this.items.push(element);
  }

  // 弹栈
  pop() {
    if (this.isEmpty()) return "Underflow";
    return this.items.pop();
  }

  // 查看栈顶元素
  peek() {
    return this.items[this.items.length - 1];
  }

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

  // 返回栈大小
  size() {
    return this.items.length;
  }

  // 清空栈
  clear() {
    this.items = [];
  }
}

使用示例

const stack = new Stack();
stack.push(10);
stack.push(20);
console.log(stack.pop()); // 输出 20
console.log(stack.peek()); // 输出 10

基于链表的栈实现

通过链表节点实现栈,避免数组的固定大小限制:

js栈实现

class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

class LinkedListStack {
  constructor() {
    this.top = null;
    this.length = 0;
  }

  push(value) {
    const newNode = new Node(value);
    newNode.next = this.top;
    this.top = newNode;
    this.length++;
  }

  pop() {
    if (this.isEmpty()) return null;
    const poppedValue = this.top.value;
    this.top = this.top.next;
    this.length--;
    return poppedValue;
  }

  peek() {
    return this.top?.value;
  }

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

性能对比

  • 数组栈:操作时间复杂度为O(1),但可能触发动态扩容。
  • 链表栈:无需扩容,但每个操作需处理指针,常数时间略高。

应用场景

  1. 函数调用栈:记录函数执行上下文。
  2. 括号匹配:检查表达式中的括号是否成对。
  3. 撤销操作:保存操作历史以便回退。

括号匹配示例

function isBalanced(expr) {
  const stack = new Stack();
  const map = { '(': ')', '[': ']', '{': '}' };

  for (const char of expr) {
    if (map[char]) stack.push(char);
    else if (char !== map[stack.pop()]) return false;
  }
  return stack.isEmpty();
}
console.log(isBalanced("{[()]}")); // true

注意事项

  • 数组实现需注意边界条件(如空栈弹栈)。
  • 链表实现需正确处理next指针,避免内存泄漏。
  • 根据场景选择实现方式,高频操作推荐数组栈。

标签: js
分享给朋友:

相关文章

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…