2014-11-04 94 views
0

我在java中制作了一个括号检查程序,它从标准输入读入文本流并使用堆栈来确定它的括号是否正确平衡。例如,它应该为[()]{}{[()()]()}输入true,在[(])输出false。我已经做了Stack类我自己对这个问题:java中的括号检查器

public class Stack { 
private char items[]; 
private int top; 

Stack(int n){ 
    items = new char[n]; 
    top = -1; 
} 

void push(char c){ 
    if(top == items.length-1){ 
     System.out.println("Stack full."); 
     return; 
    } 
    top++; 
    items[top] = c; 
} 

char pop(){ 
    if(isEmpty()){ 
     System.out.println("Stack empty"); 
     return (char)0; 
    } 
    char p; 
    p = items[top]; 
    top--; 
    return p; 
} 

boolean isEmpty(){ 
    if(top == -1) 
     return true; 
    else  
     return false; 
} 

}

checkValid方法下面需要一个字符串输入,如果括号匹配返回true,false,如果它们不匹配。

public static Boolean checkValid(String str){ 
     char sym,prev; 
     Stack s = new Stack(str.length()); 
     for(int i=0; i<str.length();i++){ 
      sym = str.charAt(i); 
      if(sym == '(' || sym=='{' || sym=='['){ 
       s.push(sym); 
      } 
      if(sym == ')' || sym=='}' || sym==']'){ 
       if(s.isEmpty()){ 
        return false; 
       } 
       else{ 
        prev = s.pop(); 
        if(!isPairMatch(prev,sym)) 
         return false; 
       } 
      } 

     } 
     if(!s.isEmpty()) 
      return false; 
     return true; 
    } 
    public static boolean isPairMatch(char character1, char character2){ 
     if(character1 == '(' && character2 == ')') 
      return true; 
     else if(character1 == '{' && character2 == '}') 
      return true; 
     else if(character1 == '[' && character2 == ']') 
      return true; 
     else 
      return false; 
    } 
} 

有没有办法打印不匹配圆括号的位置?

+0

那么,不匹配的圆括号的位置应该与堆栈的大小(或“大小-1”)相同。 – Tom 2014-11-04 10:03:43

回答

1

如果你的筹码,而不是抱着chars,将举行一个同时包含char和输入字符串,char的指标,你就可以打印出无与伦比的括号的索引类。

编辑:

如果你想失败的isPairMatch测试都无法比拟的括号的索引该解决方案时,才需要。

例如,如果您有字符串“[{} {} {})”,那么不匹配的对是第一个“[”和最后一个“)”,其索引为0和7.

如果您只需要第一个不匹配括号的索引(即第一个索引为0的“[”),则只需在删除该括号后检查堆栈的大小。在这个例子中,当最后一对被检查时堆栈将是空的,所以堆栈的大小将为0,这是失败的isPairMatch测试的第一个字符的索引。

+0

然后程序能够检查是否有一个特定的开幕式的正确右括号? – rick112358 2014-11-04 10:03:56

+0

您需要一个映射其中k是索引,v是数值,即括号。 – ha9u63ar 2014-11-04 10:04:40

+0

@ rick112358你的算法会保持不变。唯一的区别是,代替(例如)将'{'推入堆栈,您会推新的Item('{',4)。 'isPairMatch'将接收两个项目而不是两个字符,如果这些项目中存储的字符对不匹配,则可以打印这些字符的索引。 – Eran 2014-11-04 10:08:30