当前位置:首页 > JavaScript

js 实现堆栈

2026-02-01 23:51:36JavaScript

使用数组实现堆栈

在JavaScript中,数组天然支持堆栈的pushpop操作,可以直接模拟堆栈行为。

const stack = [];
stack.push(1); // 入栈
stack.push(2);
const top = stack.pop(); // 出栈,返回2

封装类实现堆栈

通过类封装可以更规范地实现堆栈操作,包括pushpoppeekisEmpty等方法。

js 实现堆栈

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

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

  pop() {
    if (this.isEmpty()) return undefined;
    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

使用链表实现堆栈

链表实现可以避免数组扩容带来的性能问题,适合动态大小堆栈。

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 value = this.top.value;
    this.top = this.top.next;
    this.length--;
    return value;
  }

  peek() {
    if (this.isEmpty()) return null;
    return this.top.value;
  }

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

  size() {
    return this.length;
  }
}

处理堆栈溢出

JavaScript引擎有调用堆栈大小限制,递归过深会导致堆栈溢出错误。可以通过尾递归优化或改用循环避免。

// 危险示例:可能堆栈溢出
function factorial(n) {
  if (n === 1) return 1;
  return n * factorial(n - 1);
}

// 安全示例:改用循环
function safeFactorial(n) {
  let result = 1;
  for (let i = 2; i <= n; i++) {
    result *= i;
  }
  return result;
}

堆栈的典型应用场景

堆栈常用于实现函数调用、表达式求值、括号匹配等场景。例如实现括号匹配检查器:

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

  for (let char of expr) {
    if (char in map) {
      stack.push(char);
    } else if (Object.values(map).includes(char)) {
      if (stack.length === 0 || map[stack.pop()] !== char) {
        return false;
      }
    }
  }

  return stack.length === 0;
}

console.log(isBalanced('({[]})')); // true
console.log(isBalanced('({[)}')); // false

标签: 堆栈js
分享给朋友:

相关文章

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…

js 实现页面刷新

js 实现页面刷新

使用 location.reload() location.reload() 是原生 JavaScript 提供的页面刷新方法。调用该方法会重新加载当前页面,相当于点击浏览器的刷新按钮。 // 基本…

js实现乘法

js实现乘法

实现乘法运算的方法 在JavaScript中实现乘法运算可以通过多种方式完成,以下列举几种常见方法: 基础运算符 直接使用乘法运算符*是最简单的方式: let result = 3 * 5; //…

vue.js实现scrollTop

vue.js实现scrollTop

Vue.js 实现 scrollTop 的方法 使用原生 JavaScript 实现 通过 window.scrollTo 或 Element.scrollTop 实现滚动到指定位置。在 Vue 中可…