返回

数据结构栈的运作原理及算法举例

后端

数据结构栈:概述与原理

栈的基本概念

栈(Stack)是一种遵循先进后出(First In Last Out, FILO)原则的数据结构。数据进入栈的顺序与数据离开栈的顺序相反,就像叠放盘子一样。后放置的盘子先取走,先放置的盘子后取走。

栈的实现与操作

在JavaScript中,我们可以使用数组来实现栈。栈的基本操作包括:

  • push():将元素压入栈顶。
  • pop():从栈顶弹出元素。
  • peek():查看栈顶元素。
  • isEmpty():判断栈是否为空。

栈的常见算法

1. 括号匹配问题

括号匹配问题是指给定一个由括号组成的字符串,判断这些括号是否成对且匹配。例如,"([]{})"是一个有效的括号匹配,而"([}])"不是。

可以使用栈来解决括号匹配问题。当遇到左括号时,将其压入栈中;当遇到右括号时,将其弹出并与栈顶的左括号进行匹配。如果匹配成功,则继续进行;如果匹配失败,则说明括号不匹配。

function isBalancedParentheses(str) {
  const stack = [];
  const openBrackets = ['(', '[', '{'];
  const closeBrackets = [')', ']', '}'];

  for (let char of str) {
    if (openBrackets.includes(char)) {
      stack.push(char);
    } else if (closeBrackets.includes(char)) {
      const top = stack.pop();
      if (openBrackets.indexOf(top) !== closeBrackets.indexOf(char)) {
        return false;
      }
    }
  }

  return stack.length === 0;
}

2. 中缀表达式转后缀表达式

中缀表达式是常见的数学表达式,其中运算符位于操作数之间。后缀表达式,也称为逆波兰表示法,是另一种数学表达式,其中运算符位于操作数之后。

可以使用栈来将中缀表达式转换为后缀表达式。当遇到操作数时,将其输出;当遇到运算符时,将其压入栈中。当遇到右括号时,将栈中的所有运算符弹出并输出。

function infixToPostfix(infix) {
  const operators = ['+', '-', '*', '/'];
  const precedence = {
    '+': 1,
    '-': 1,
    '*': 2,
    '/': 2
  };
  const stack = [];
  const postfix = [];

  for (let token of infix) {
    if (!operators.includes(token)) {
      postfix.push(token);
    } else {
      while (stack.length > 0 && precedence[token] <= precedence[stack[stack.length - 1]]) {
        postfix.push(stack.pop());
      }
      stack.push(token);
    }
  }

  while (stack.length > 0) {
    postfix.push(stack.pop());
  }

  return postfix.join('');
}

结语

栈作为一种重要的数据结构,在计算机科学中有着广泛的应用。通过学习数据结构栈的运作原理和常见算法,我们可以更好地理解栈的用法和实现原理,为更深入地学习计算机科学打下坚实的基础。