Ruby:如何确定一系列的圆括号/花括号/方括号是否有效?

Ruby:如何确定一系列的圆括号/花括号/方括号是否有效?,ruby,Ruby,我刚刚得到了这个字符串数组: expressions = [ ")(){}", "[]({})", "([])", "{()[]}", "([)]" ] 我应该编写一个函数,为每个无效字符串打印0,为每个有效字符串打印1。因此,这个函数的输出作为一个参数被给定为expressions,即01,1,1,0 我该怎么做 def check_braces(expressions) # ?? end ==更新== 根据彼得的暗示,我想出了一个答案: expressions = [ ")(){}"

我刚刚得到了这个字符串数组:

expressions = [ ")(){}", "[]({})", "([])", "{()[]}", "([)]" ]
我应该编写一个函数,为每个无效字符串打印0,为每个有效字符串打印1。因此,这个函数的输出作为一个参数被给定为
expressions
,即
01,1,1,0

我该怎么做

def check_braces(expressions)
  # ??
end
==更新==

根据彼得的暗示,我想出了一个答案:

expressions = [ ")(){}", "[]({})", "([])", "{()[]}", "([)]" ]
# expressions = [ "[]({})" ]

def check_braces(expressions)
  matchers = {
      "{" => "}",
      "[" => "]",
      "(" => ")"
      }

  expressions.each do |expression|
    elements = []
    expression.chars.each do |char|
      elements << char if elements.empty?
      last_element = elements[-1]
      if char == matchers[last_element]
        elements.pop
      end
    end
    puts (elements.empty? ? 1 : 0)
  end
end

check_braces(expressions)
#0
#1
#1
#1
#0
expressions=[”)({}“,“[”({})”,“([]),“{()[]),“([)]”
#表达式=[“[]({})”]
def check_大括号(表达式)
匹配器={
"{" => "}",
"[" => "]",
"(" => ")"
}
表达式。每个do |表达式|
元素=[]
expression.chars.each do| char|

元素这里是基本思想,我将把实现留给您。对于每个字符串

  • 循环通过它的字符
  • 当您看到一个
    {[(
    )时,将其放入堆栈(Ruby数组可以作为堆栈使用)
  • 当您看到一个
    }]
    时,请查看数组中的最后一个字符,并查看它是否匹配(例如,数组中的最后一个元素是
    [
    ,您有一个
    ]
    ,这就是匹配)。如果匹配,则弹出数组中的最后一个元素;每当您看到一个不匹配时,字符串就坏了,您可以停止循环

  • 代码的一个潜在问题是,它无法捕获类似以下内容的内容:
    “[]({)”

    如果添加elsif检查当前字符是否已在元素数组中,如果未在元素数组中,则将其打开,这将解决此问题:

    if char == matchers[last_element]
        elements.pop
      elsif !elements.include? char
        elements << char
      end
    
    if char==matchers[最后一个元素]
    流行元素
    elsif!elements.include?char
    
    元素遇到了这样一种情况:它不起作用
    {([)]}
    ,我将其附加到表达式数组的末尾

    这是我的解决方案,我把它缩短了一点

    expressions = [ ")(){}", "[]({})", "([])", "{()[]}", "([)]", "{([)]}" ]
    
    def check_braces(exps)
      m = { "{" => "}", "[" => "]", "(" => ")" }
      exps.each do |ex|
        el = []
        ex.chars.each do |char|
          char == m[el[-1]] ? el.pop : el.push(char)
        end
        puts (el.empty? ? 1 : 0)
      end
    end
    
    check_braces(expressions)
    

    什么构成有效字符串?@Linuxios他正在寻找匹配的开始括号和结束括号。因此
    ()
    [(])中有效
    无效,因为闭包不匹配。很好,我明白了!我会试试看。我在这个问题上花了一个小时,但没有找到答案。经过您的解释,我花了2分钟才弄明白。谢谢!