如何实现关闭打开的尖括号的逻辑`<;`在Javascript的字符串中

如何实现关闭打开的尖括号的逻辑`<;`在Javascript的字符串中,javascript,algorithm,Javascript,Algorithm,想象一下下面的字符串“>您需要熟悉堆栈数据结构才能理解这一点,但从这里开始,它应该是简单明了的!另外,为了能够讨论这个问题,我会说一个子句是一个左括号,后面跟任何东西,后面跟一个右括号。所以是一个子句,

想象一下下面的字符串“>您需要熟悉堆栈数据结构才能理解这一点,但从这里开始,它应该是简单明了的!另外,为了能够讨论这个问题,我会说一个子句是一个左括号,后面跟任何东西,后面跟一个右括号。所以
是一个子句,
也是一个子句。注意,子句可以包含嵌套子句--
是第二个示例中子句中的一个子句

现在我们有了一种语言来讨论这个问题,让我们来讨论一下算法

我们将从左到右遍历字符串。每次我们看到左括号,我们就“跨入”了一个新的子句。我们只有在碰到相应的右括号时才“离开”该子句。但是我们如何处理嵌套大括号呢?好吧,如果我们在第1条中,碰到左括号,我们现在在一个新的条款中(我们称之为第2条)。当我们击中右括号时,我们不想留下第1条,只留下第2条。事实上,如果你想一想,你会意识到当我们打右括号时,我们只留下一个子句——嵌套在里面的子句仍然需要关闭

最完美的数据结构是堆栈。我们将在读取左大括号时将其推到堆栈上,在读取右大括号时将其从堆栈中弹出。这将保留我们所需要的嵌套结构——如果我们将第2条嵌套在第1条中,第2条将位于堆栈的上面,并且必须在关闭第1条之前弹出

因此,处理结束时堆栈的状态意味着什么?如果堆栈为空,则每个子句都已正确关闭。如果堆栈仍有剩余项,则意味着有一些未闭合的大括号。只要将每个左大括号从堆栈中弹出,并将其相应的右大括号附加到字符串的末尾就足够了

附加说明:


如果我们试图从堆栈中弹出一些东西,而堆栈是空的,那么我们有太多的右大括号了!您还应该检查弹出的对象是否是相应的大括号,因为您可能有不匹配的大括号类型(在您的示例中,我们处理的是“(”,)[”,以及“为什么它应该输出
而不是
?你是对的!我会编辑这篇文章的,谢谢你!当然,但我的目的不是要提醒你注意你的错误。我的目的是鼓励你将你想要的输出转化为具体的、可复制的指令。一旦你能够做到这一点,并证明这些指令在应用于任何应用程序时都是有效的有效的输入,然后将这些指令翻译成程序应该很简单。
// learned from an article on medium.
let isMatchingBrackets = function(str) {
    const stack = [];
    const map = {
      '(': ')',
      '[': ']',
      '{': '}'
    }

    for (let i = 0; i < str.length; i++) {
      // If character is an opening brace add it to a stack
      if (str[i] === '(' || str[i] === '{' || str[i] === '[' ) {
        stack.push(str[i]);
      }
      // If that character is a closing brace, pop from the stack, which will also reduce the length of the stack each time a closing bracket is encountered.
      else {
        let last = stack.pop();

        //If the popped element from the stack, which is the last opening brace doesn’t match the corresponding closing brace in the map, then return false
        if (str[i] !== map[last]) {return false};
      }
    }
    // By the completion of the for loop after checking all the brackets of the str, at the end, if the stack is not empty then fail
    if (stack.length !== 0) {return false};

    return true;
}