试图让代码检查是否有括号

时间:2016-11-13 06:12:59

标签: java if-statement while-loop boolean brackets

我目前正在尝试提供一个扫描字符串的代码 并检查每行上是否有偶数个开括号和右括号。如果是这样,它将返回true。 (请原谅格式化不正确,但除非我将其标识为代码,否则无法正确形成示例)

{}    // The code would return true    
{{}}
{}{}
{{{}{{}}}}


}     // The code would return false
{}
}}{
{{{}{}

到目前为止我尝试了什么:

    public boolean bracketsMatch(String brackets)
{
  int lb = 0;
  int rb = 0;
  int i = 0;
  while (brackets.charAt(i) == '{' || brackets.charAt(i) == '}' || brackets.charAt(i) == '')
  {
      if (brackets.charAt(i) == '{')
      {
        lb += 1; 
      }

      if (brackets.charAt(i) == '}')
      {
          rb += 1;
      }

      if (brackets.charAt(i) == '')
      {
          if (lb / rb == 2)
          {
              // Is it possible to get the code scan the next line to next line?
              // need an extra statement here for ^^ before I can place the if statement below
            if (bracket.charAt(i + 1) == '')
            {
              return true; 
            }
          }

            else 
          {
              return false;
          }
      }
      i++

  }
}

我提前为任何有经验的程序员道歉,因为这将是一个低效的噩梦。一般来说,我对编程比较陌生。我试图让代码检查左括号(lb)和右括号(rb)的数量。每当代码变为空字符串时,它将lb除以rb。如果代码不等于2,则代码将返回false。我可能在这段代码中有十几个错误,但我想知道是否有任何方法让代码进入下一行扫描下一组括号。感谢您提前提供任何帮助。

编辑1:

public boolean bracketsMatch(String brackets)
{
  int balance = 0;
  for (int i = 0; i < brackets.length(); i++)
  {
      char value = brackets.charAt(i);
      if (value == '{')
      {
        balance += 1; 
      }

      else if (value == '}')
      {
          balance -= 1;
      }

  }

  if (balance != 0)
  {
      return false;
  }

  else
  {
      return true;
  }
}

2 个答案:

答案 0 :(得分:3)

这不会编译,因为''是无效的字符文字:

if (brackets.charAt(i + 1) == '')

您目前计算开启和关闭括号的方法, 并检查lb / rb的值不会产生正确的结果。

您不需要计算右括号。您只需计算开括号,并在关闭时减少该数量。

这是您可以使用的算法草图, 我希望不要破坏这项运动:

  1. 对于字符串中的每个字符
  2. 如果它是一个开括号,请递增计数
  3. 如果它是一个紧密的支架
    • 如果开盘数为0,则无法关闭,因此它们不均衡,我们可以停止
    • 减少计数
  4. 在所有字符之后,如果打开计数为0,则括号是平衡的
  5. 作为附加代码审核说明,这在很多方面都很糟糕:

      if (brackets.charAt(i) == '{') {
        // ...
      }
    
      if (brackets.charAt(i) == '}') {
        // ...
      }
    

    什么不好:

    • 如果结果始终相同,则不需要重复调​​用brackets.charAt(i)。调用一次并将结果保存在变量中。
    • 两个if条件是排他性的:如果第一个条件为真,则第二个条件为真,所以评估它是没有意义的。第二个条件应为if else而不是if。而不是if-else链,switch在这里可能会更有趣。
    • 不是调用字符串brackets,而是将其称为更通用的内容。如果实际输入是&#34; {something}&#34 ;?然后它不仅仅包含括号,但算法的工作方式也相同。称之为括号会产生误导。

答案 1 :(得分:1)

替代方法

您可以使用Java Stack类[因为它表示对象的List-In-First-Out堆栈]。您可以使用Stack类的push和pop方法。这是实施。

public class BracketMatching {

    public static boolean bracketMatch(String input){

        Stack<Character> st = new Stack<>();

        for(char c : input.toCharArray()){

            if( c == '{')
                st.push(c);

            else if(c == '}'){

                if(st.isEmpty())
                    return false;

                st.pop();   
            }
        }

        if(st.isEmpty())
        return true;

        return false;

    }
    public static void main(String[] args){

        String input1 = "{}{{}}{}{}{{{}{{}}}}";
        String input2 = "}{}}}{{{{}{}";

        System.out.println(bracketMatch(input1));
        System.out.println(bracketMatch(input2));

    }
}