数据结构课作业8——括号匹配
时间限制: 1 Sec 内存限制: 128 MB
提交: 278 解决: 113
[提交][状态][讨论版]
题目描述
检查字符串中方括号、圆括号和花括号是否配对
输入
每个字符串一行,以0表示输入结束
输出
true 或者 false 每个一行
样例输入
(12,11,44,[6,[9]),(#)
([#],([2],3,1}
([#],([2],3,1),7)
0
样例输出
false
false
true
这是一道数据结构课后作业,看着蛮简单的,思路也挺清晰,首先明确
错误例子有这些:
1.][
2.[(])
3.(][)
4.[[
可以知道,只判断左右括号个数是否相等是不靠谱的,只能解决第四个
例子,用一个map记录左右括号个数也想过,进来的时候将map[该括号]+=1
然后判断如果当前遇到的括号是右括号的话,查看左括号数是否小于右括号
数,小于的话即为不匹配,这个方法可以解决1.2.4的情况,3.的情况还要
更复杂一些,没有去想,索性直接采用标准做法,用栈来做。
思路如下:
遇到一个左括号,入栈。
遇到一个右括号,查看当前栈顶是否为对应的左括号:
是的情况:栈顶出栈,继续下一个括号的判断
不是的情况:直接中断遍历括号的行为,因为这个就直接不匹配了
感觉思路也蛮清晰的,所以直接就开始写代码了,结果每次提交都是答案
错误
错误代码如下:
1 import java.io.*; 2 import java.util.*; 3 4 public class Main { 5 public static void main(String[] args){ 6 Scanner in = new Scanner(new BufferedInputStream(System.in)); 7 String str = null; 8 while((str=in.nextLine())!=null){ 9 if(str.charAt(0)=='0' && str.length()==1){ 10 break; 11 } 12 Stack<Character>stack = new Stack<Character>(); 13 int false_flag = 0; 14 try{ 15 for(int i=0;i<str.length();i++){ 16 if(str.charAt(i)=='('||str.charAt(i)=='['||str.charAt(i)=='{'){ 17 stack.push(str.charAt(i)); 18 continue; 19 } 20 if(str.charAt(i)==')'){ 21 if(stack.peek()!='('){ 22 false_flag = 1; 23 break; 24 }else{ 25 stack.pop(); 26 } 27 } 28 if(str.charAt(i)==']'){ 29 if(stack.peek()!='['){ 30 false_flag = 1; 31 break; 32 }else{ 33 stack.pop(); 34 } 35 } 36 if(str.charAt(i)=='}'){ 37 if(stack.peek()!='{'){ 38 false_flag = 1; 39 break; 40 }else{ 41 stack.pop(); 42 } 43 } 44 } 45 }catch(Exception e){false_flag = 1;} 46 if(false_flag==1){ 47 System.out.println("false"); 48 }else{ 49 System.out.println("true"); 50 } 51 } 52 } 53 }