问题描述
编译器检查程序的语法错误,会检验每一个右花括号、右方括号、右园括号或者注释结束符号是否有与其对应的左花括号、左方括号、左园括号或者注释其实符与其对应。如果有编译才会通过,否则会报编译错误。请写一个算法实现检验一个字符串是否有这样的语法错误。
算法描述
做一个空栈。读入字符直到文件结尾。如果字符是一个开放符号,则将其推入栈中。如果字符是一封闭符号,则当栈空时报错,否则将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件结尾如果栈非空也报错。
代码实现
public static boolean isBalanceChar(String s) {
LinkedList<Character> stack = new LinkedList<Character>();
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch(c) {
case '(':
case '[':
case '{':
stack.push(c);
break;
case '/':
if(i < s.length()-1 && s.charAt(i+1) == '*') {
stack.push(c);
i++;
}
break;
case ')':
if(stack.size() == 0 || stack.pop() != '(') {
System.out.println("illigal character ().");
return false;
}
break;
case ']':
if(stack.size() == 0 || stack.pop() != '[') {
System.out.println("illigal character [].");
return false;
}
break;
case '}':
if(stack.size() == 0 || stack.pop() != '{') {
System.out.println("illigal character {}.");
return false;
}
break;
case '*':
if(i < s.length()-1 && s.charAt(i+1) == '/') {
if(stack.size() == 0 || stack.pop() != '/') {
System.out.println("illigal character /**/.");
return false;
}
i++;
}
break;
default:
break;
}
}
return stack.size() == 0;
}