括号匹配-记错心得

数据结构课作业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 }
View Code

这让我很郁闷,经过了超久的测试,终于发现。。。我这个代码竟然过不了
4.这种最简单的情况!!!!!究其原因是在判断匹配不匹配的时候,我直
接粗暴的用一个flag来判断,只有当出栈发生异常(即第一个遇到的就是右括号),
或者遇到右括号栈顶不是左括号的情况,我才判断他是不匹配,而没有判断
只有左括号的情况。。。这真的很粗心大意啊,看来以后一定要一开始就明确
错误例子,改正方法即为,判断栈是否为空,为空即为匹配,不为空则不匹配
正确代码如下:

 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                             continue;
27                         }
28                     }
29                     if(str.charAt(i)==']'){
30                         if(stack.peek()!='['){
31                             false_flag = 1;
32                             break;
33                         }else{
34                             stack.pop();
35                             continue;
36                         }
37                     }
38                     if(str.charAt(i)=='}'){
39                         if(stack.peek()!='{'){
40                             false_flag = 1;
41                             break;
42                         }else{
43                             stack.pop();
44                             continue;
45                         }
46                     }
47                 }
48             }catch(Exception e){false_flag = 1;}
49             if(false_flag==1||!stack.isEmpty()){
50                 System.out.println("false");
51             }else{
52                 System.out.println("true");
53             }
54         }
55     }
56 }
原文地址:https://www.cnblogs.com/sword-magical-blog/p/7610679.html