2016-11-13 46 views
0

我目前正试图想出一个代码,该代码将扫描字符串 并检查每行上是否有偶数个打开和关闭括号。如果是这样,它会返回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; 
    } 
} 
+0

第一个示例返回true,因为每行上都有偶数个括号。第二个可能有一个{},但大多数行的开放和闭合括号数量不等。 –

+0

要验证括号是否平衡,您需要'lb == rb',而不是'lb/rb == 2'。而且这个代码不会编译,因为''''不是一个有效的字符文字。 –

+1

在正常的括号内使用时,'{'必须在'}之前吗?换句话说,这条线应该是什么结果:'} {'?此外,你的行只包含括号,或者可以是,例如,“{ok}”? –

回答

3

这将无法编译,因为''是无效字符文字:

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

和当前计数打开和关闭支架的方法, 并检查lb/rb的值将不会产生正确的结果。

您不需要计算正确的括号。您只需计算开放的括号,并在关闭时减少计数。

下面是一个算法的草图就可以使用, 我希望不会破坏运动:

  1. 对于字符串中的每个字符
  2. 如果它是一个开放的支架,增加计数
  3. 如果它是一个闭括号
    • 如果打开次数为0,没有什么可以关闭,所以他们不均衡,我们可以停止
    • 递减计数
  4. 所有字符后,如果打开次数是0,括号内是平衡

作为一个额外的代码审查注意到,这是坏在许多方面:

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

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

什么是坏:

  • 如果结果始终相同,则不必重复拨打brackets.charAt(i)即可。调用一次并将结果保存在变量中。
  • 这两个if条件是排他性的:如果第一个条件成立,第二个条件不成立,所以评估它是毫无意义的。第二个条件应该是if else而不是if。而不是一个if-else链,switch在这里可能更有趣。
  • 而不是调用字符串brackets,最好把它称为更一般的东西。如果实际输入是“{something}”呢?然后它包含的不仅仅是括号,但算法的工作原理也是一样的。称它为括号是误导。
+1

Upvoted为一个很好的算法草图的目的(不,我不认为你太多了)。 –

+0

这很好,因为你没有多个计数器,或者保存不必要的值,如果没有办法解决这个问题,也可以打破。我添加了一个工作流程,使您的答案更加完善。干杯。 – Thrasher

+0

感谢@Thrasher的尝试,像这样的图表可以真正迎合这个答案。不幸的是,你提出的图表与我所描述的步骤不相符,在几个点上是不正确的,所以我不得不拒绝它。 – janos

1

替代的方式做

您可以使用Java Stack类[因为它代表对象的名单入先出的栈]。您可以使用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)); 

    } 
} 
+0

但是为什么在你不需要的时候使用堆栈呢?为什么商店价值你并不需要? (如果你使用'st.push('x')'而不是'st.push(c)',程序仍然可以工作,因为这个值甚至不重要。因此,我的反对意见是:为什么要麻烦存储它) – janos

+0

它只是一个替代解决方案。我正在考虑像“{{}}”这样的情况,他们之间可能会有任何额外的字符,如空格和换行符。 – Someone

+0

额外的角色如何产生影响? (他们没有) – janos