当前位置:首页 > JavaScript

js栈实现

2026-02-01 07:30:45JavaScript

栈的基本概念

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

基于数组的栈实现

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

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

基于链表的栈实现

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

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. 撤销操作:保存操作历史以便回退。

括号匹配示例

js栈实现

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实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js实现授权

js实现授权

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