Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查括号是否匹配总是说它们匹配_Java - Fatal编程技术网

Java 检查括号是否匹配总是说它们匹配

Java 检查括号是否匹配总是说它们匹配,java,Java,我正在编写一个程序,在这个程序中,我应该检查左括号和右括号是否匹配。如果不匹配,我应该显示No。否则,我应该显示yes 这是我编写的函数,从输入缓冲区获取输入。然而,对于第二个测试用例,我只是不断地收到yes,而不是yes-NO-yes,但是其他两个用例是正确的 static String[] braces(String[] values) { Stack<Character> st = new Stack<Character>(); String[] answer =

我正在编写一个程序,在这个程序中,我应该检查左括号和右括号是否匹配。如果不匹配,我应该显示No。否则,我应该显示yes

这是我编写的函数,从输入缓冲区获取输入。然而,对于第二个测试用例,我只是不断地收到yes,而不是yes-NO-yes,但是其他两个用例是正确的

static String[] braces(String[] values) {
Stack<Character> st = new Stack<Character>();
String[] answer = new String[values.length];
for(int i =0; i<values.length;i++){
  char[] crt = values[i].toCharArray();
  for(char c : crt){
    switch(c){
      case '{':
      case '(':
      case '[':
        st.push(c);
        break;
      case '}':
        if(st.isEmpty() || (st.peek() != '{'))
        {
          answer[i]= "NO";
            break;
        }
        st.pop();

      case ')':
        if(st.isEmpty() || (st.peek() != '('))
        {
          answer[i]= "NO";
            break;
        }
        st.pop();


      case ']':
        if(st.isEmpty() || (st.peek() != '['))
        {
          answer[i]= "NO";
            break;
        }
        st.pop();


    }
  }


  if(st.isEmpty() && answer[i].equals("NO") ){
    answer[i]="YES";
    System.out.println("I set answer[" + i + "] = YES due to stack being empty");
  }
  else
  {
    answer[i]="NO";
    System.out.println("I set answer[" + i + "] = NO due to stack being non-empty");
  }
          st.clear();
}
return answer;
静态字符串[]大括号(字符串[]值){
Stack st=新堆栈();
String[]answer=新字符串[values.length];

对于(int i=0;i将
stack.firstElement()
更改为
stack.peek()
,您需要堆栈顶部而不是第一个元素。(
firstElement
不是
堆栈
方法)

StackOverflow的最大秘密在于,实际上并不是所有的专家都像Neo看待矩阵一样看待代码,而是人们在检查你的程序如何运行

您可以自己完成这项工作,最古老、最琐碎的方法是通过所谓的“打印调试”

简而言之,您只需添加打印语句,打印您的代码正在执行的操作,然后将其与您认为应该执行的操作进行比较。以下是添加了此类打印语句的代码:

import java.util.*;

public class Test {
  static String[] braces(String[] values) {
    Stack<Character> st = new Stack<Character>();
    String[] answer = new String[values.length];
    for(int i =0; i<values.length;i++){
      char[] crt = values[i].toCharArray();
      boolean an = false;
      for(char c : crt){
        switch(c){
          case '{':
          case '(':
          case '[':
            st.push(c);
            break;
          case '}':
            if(st.isEmpty() || (st.firstElement() != '{'))
            {
              answer[i]= "NO";
              System.out.println("I set answer[" + i + "] = NO due to mismatched }");
            }
            st.pop();
            break;

          case ')':
            if(st.isEmpty() || (st.firstElement() != '('))
            {
              answer[i]= "NO";
              System.out.println("I set answer[" + i + "] = NO due to mismatched )");
            }
            st.pop();
            break;

          case ']':
            if(st.isEmpty() || (st.firstElement() != '['))
            {
              answer[i]= "NO";
              System.out.println("I set answer[" + i + "] = NO due to mismatched ]");
            }
            st.pop();
            break;

        }
      }

      if(st.isEmpty()){
        answer[i]="yes";
        System.out.println("I set answer[" + i + "] = YES due to stack being empty");
      }
      else
      {
        answer[i]="no";
        System.out.println("I set answer[" + i + "] = NO due to stack being non-empty");
      }
      st.clear();
    }

    return answer;
  }
  public static void main(String[] args) {
    String[] result = braces(new String[] { "(foo}" });
    for(String s : result) System.out.println("The final result is " + s);
  }
}
嗯,看起来你在覆盖你以前的答案。你应该确保最后的测试不会覆盖循环的结论

简单的方法是检查
answer[i]
是否为null,但更好的方法是创建第二个助手方法
boolean brates(String)
,该方法可以在任何时候自由
返回true
false
,然后在
brates(String[])中的循环中调用该函数

无论如何,这将是我的实现:

import java.util.Stack;

class Test {
  static char flip(char c) {
    switch(c) {
      case '}': return '{';
      case ')': return '(';
      case ']': return '[';
      default: throw new IllegalArgumentException("Invalid paren " + c);
    }
  }

  static boolean matched(String value) {
    Stack<Character> st = new Stack<Character>();
    for (int i=0; i<value.length(); i++) {
      char c = value.charAt(i);
      switch(c) {
          case '{':
          case '(':
          case '[':
            st.push(c);
            break;

          case '}':
          case ')':
          case ']':
            if (st.isEmpty() || st.peek() != flip(c)) {
              return false;
            }
            st.pop();
            break;
      }
    }
    return st.isEmpty();
  }

  static String[] braces(String[] values) {
    String[] result = new String[values.length];
    for(int i=0; i<result.length; i++) {
      result[i] = matched(values[i]) ? "yes" : "no";
    }
    return result;
  }

  public static void main(String[] args) {
    String[] input = new String[] { "}", "{}", "{()}", "asdf", "", "{[", "{[[([])]]}", "((foo))" };
    String[] actual = braces(input);
    String[] expected = new String[] { "no", "yes", "yes", "yes", "yes", "no", "yes", "yes" };
    for(int i=0; i<actual.length; i++) {
      if(!actual[i].equals(expected[i])) {
        System.out.println("Failed: " + input[i] + " should have been " + expected[i]);
        System.exit(1);
      }
    }
    System.out.println("OK");
  }
}
import java.util.Stack;
课堂测试{
静态字符翻转(字符c){
开关(c){
大小写“}”:返回“{”;
大小写“)”:返回“(”;
案例']':返回'[';
默认值:抛出新的IllegalArgumentException(“无效参数”+c);
}
}
静态布尔匹配(字符串值){
Stack st=新堆栈();
对于(inti=0;i
importjava.util.*;
导入java.util.stream.collector;
公开课考试{
静态最终映射参数;
静态最终设定关闭参数;
静止的{
PARENS=新的HashMap();
PARENS.put('{','}');
PARENS.put('[',']');
PARENS.put(“(”,“)”);
CLOSING_PARENS=新哈希集(PARENS.values());
}
公共静态void main(字符串[]args){
打印(大括号(“(foo}”、“[]”、“()”、“{}”、“[{}]”、“([{}])、“[[]]”);
打印(大括号(“[”,“]”,“][”,“[{]}”);
//测试用例2。。。
打印(大括号(“{[()]}”,“{[(])}”,“{{{[(())]]}”);
//…打印是否是。。。
}
静态无效打印(字符串…值){
for(字符串str:values){
系统输出打印(str+“”);
}
System.out.println();
}
静态字符串[]大括号(字符串…值){
返回Arrays.stream(值)
.map(测试::isBalanced)
.map(b->b?“是”:“否”)
.collect(Collectors.toList()).toArray(新字符串[values.length]);
}
静态布尔isBalanced(字符串标记){
堆栈=新堆栈();
for(char c:token.toCharArray()){
if(PARENS.keySet()包含(c)){
堆栈推送(c);
}else if(结束部分包含(c)){
if(stack.isEmpty()| |!PARENS.get(stack.pop()).equals(c)){
返回false;
}
}
}
返回stack.isEmpty();
}
}

您只需进行以下更改

  • 在所有情况下,将
    firstElement()
    替换为
    peek()

  • 从前两个案例中删除以下语句

          stack.pop();
          break;
    
  • 检查最后一个案例中的堆栈是否为empity
  • 如果(!stack.isEmpty())

    更正代码:

    public class ParenMatch{
    
        public static void main(String[] args){
        String[] str = { "{}[](){[}]","{[()]}{[(])}{{[[(())]]}}","", "}][}}(}][))][](){()}()({}([][]))[](){)[](}]}]}))}(())(([[)"}; 
        System.out.println(Arrays.toString(braces(str)));
        }
    
    public static String[] braces(String[] values)
    {
        Stack<Character> stack = new Stack<Character>();
        String[] isCorrect = new String[values.length];
        for (int i = 0; i < values.length; i++)
        {
            char[] crt = values[i].toCharArray();
            boolean an = false;
            for (char c : crt)
            {
                switch(c)
                {
                    case '{':
                    case '(':
                    case '[':
                        stack.push(c);
                        break;
                    case '}':
                        if (stack.isEmpty() || (stack.peek() != '{'))
                        {
                            isCorrect[i] = "NO";
                        }
                        //stack.pop();
                        //break;
    
                    case ')':
                        if (stack.isEmpty() || (stack.peek() != '('))
                        {
                            isCorrect[i] = "NO";
                        }
                        //stack.pop();
                        //break;
    
                    case ']':
                        if (stack.isEmpty() || (stack.peek() != '['))
                        {
                            isCorrect[i] = "NO";
                        }
                        if(!stack.isEmpty())
                        stack.pop();
                        break;
                }
            }
            if (stack.isEmpty())
            {
                isCorrect[i] = "yes";
            }
            else
            {
                isCorrect[i] = "no";
            }
            stack.clear();
        }
    
        return isCorrect;
    }
    }
    
    String[] str = { "{}[](){[}]","{[()]}{[(])}{{[[(())]]}}","", "}][}}(}][))][](){()}()({}([][]))[](){)[](}]}]}))}(())(([[)"}; 
    
    输出:

    public class ParenMatch{
    
        public static void main(String[] args){
        String[] str = { "{}[](){[}]","{[()]}{[(])}{{[[(())]]}}","", "}][}}(}][))][](){()}()({}([][]))[](){)[](}]}]}))}(())(([[)"}; 
        System.out.println(Arrays.toString(braces(str)));
        }
    
    public static String[] braces(String[] values)
    {
        Stack<Character> stack = new Stack<Character>();
        String[] isCorrect = new String[values.length];
        for (int i = 0; i < values.length; i++)
        {
            char[] crt = values[i].toCharArray();
            boolean an = false;
            for (char c : crt)
            {
                switch(c)
                {
                    case '{':
                    case '(':
                    case '[':
                        stack.push(c);
                        break;
                    case '}':
                        if (stack.isEmpty() || (stack.peek() != '{'))
                        {
                            isCorrect[i] = "NO";
                        }
                        //stack.pop();
                        //break;
    
                    case ')':
                        if (stack.isEmpty() || (stack.peek() != '('))
                        {
                            isCorrect[i] = "NO";
                        }
                        //stack.pop();
                        //break;
    
                    case ']':
                        if (stack.isEmpty() || (stack.peek() != '['))
                        {
                            isCorrect[i] = "NO";
                        }
                        if(!stack.isEmpty())
                        stack.pop();
                        break;
                }
            }
            if (stack.isEmpty())
            {
                isCorrect[i] = "yes";
            }
            else
            {
                isCorrect[i] = "no";
            }
            stack.clear();
        }
    
        return isCorrect;
    }
    }
    
    String[] str = { "{}[](){[}]","{[()]}{[(])}{{[[(())]]}}","", "}][}}(}][))][](){()}()({}([][]))[](){)[](}]}]}))}(())(([[)"}; 
    
    [是,是,是,否]

    静态字符串[]大括号(字符串[]值){
    
    static String[] braces(String[] values) {
        Stack<Character> st = new Stack<Character>();
         String []answer = new String[values.length];
         Boolean isCorrect = false;
    
        for(int i =0; i< values.length;i++)
         {
             isCorrect = true;
            st.clear();
             char crt[] = values[i].toCharArray();
    
            for(char c : crt)
             { 
                 switch(c)
                 {
                 case'{':
                 case'[':
                 case'(':
                     st.push(c);
                     break;
    
                     case'}':
                     if(st.isEmpty() || st.peek() != '{')
                     {
                         System.out.println("Hellooo");
                         answer[i] ="NO";
                         isCorrect = false;
                     }
                     if(!st.isEmpty()) 
                     {
                        st.pop();
                     }
                     break;
    
                     case']':
                     if(st.isEmpty() || st.peek() != '[')
                     { 
                         System.out.println("Hell");
                         answer[i] ="NO";
                         isCorrect = false;
                     }
                     if(!st.isEmpty()) 
                     {
                         st.pop();
                    }
    
                     break;
    
                    case')':
                     if(st.isEmpty() || st.peek() != '(')
                     {
                         isCorrect = false;
                     }
    
                     if(!st.isEmpty()) {
    
                         st.pop();
    
                         }
    
                     break;
                 }
             }
    
             if(isCorrect && st.isEmpty())
    
             {
                 answer[i] = "YES";
                 System.out.println("Hello");
             }else answer[i] = "NO";
         }
        return answer;
    }
    
    Stack st=新堆栈(); String[]answer=新字符串[values.length]; 布尔值isCorrect=false; for(int i=0;i
    您试过调试它吗?寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题中重现它所需的最短代码