zoukankan      html  css  js  c++  java
  • 括号匹配-记错心得

    数据结构课作业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 }
  • 相关阅读:
    软件工程——结构化方法
    静态变量的坑
    OpenCV中对Mat的遍历访问与赋值
    SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0
    Ext.Net中的Task控件的使用
    字符集越界 正则表达式匹配车牌
    [TOEIC] 2013年12月25日托业考试总结
    WebKit 内容整理
    [C#/.NET]how to implement web application localization in .net 4.0
    C# 代码为什么比 C++代码 编译速度快?
  • 原文地址:https://www.cnblogs.com/sword-magical-blog/p/7610679.html
Copyright © 2011-2022 走看看