Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Algorithm_Math_Brackets - Fatal编程技术网

在java中测试公式中的括号是否匹配,我的算法正确吗?

在java中测试公式中的括号是否匹配,我的算法正确吗?,java,algorithm,math,brackets,Java,Algorithm,Math,Brackets,下面是我对这个问题的分析:括号匹配的条件有四种:{{()},{}[],,{[]} 因此,如果我只考虑这4种匹配形式,可能会很复杂。所以我试着找出括号不匹配的时间。如果我让{和}是一对,我发现如果一个括号在奇数位置,那么他的一对肯定在偶数位置,反之亦然。以{[]}为例,{位于奇数位置的第1位置,}位于偶数位置的第6位置。因此,我使用数字来标记它们,“()”--1,9;'[]'--2,8; '' --3,7; '{}--4,6所以如果两个数字相加等于10,那么这两个数字代表一对。然后我用这些数字来表

下面是我对这个问题的分析:括号匹配的条件有四种:
{{()}
{}[]
{[]}
因此,如果我只考虑这4种匹配形式,可能会很复杂。所以我试着找出括号不匹配的时间。如果我让
{
}
是一对,我发现如果一个括号在奇数位置,那么他的一对肯定在偶数位置,反之亦然。以
{[]}
为例,
{
位于奇数位置的第1位置,
}
位于偶数位置的第6位置。因此,我使用数字来标记它们,
“()”--1,9;'[]'--2,8; '' --3,7; '{}--4,6
所以如果两个数字相加等于10,那么这两个数字代表一对。然后我用这些数字来表示括号结构。我拉出奇数位置的括号和偶数位置的括号(用数字表示),我把奇数位置和偶数位置的每个项目加在一起,看看是否有一个匹配,加起来是10,如果没有,我说这是一个匹配。我的代码如下:

/** Matching Brackets
  * Tony
  */
import java.util.*;

public class Solution19 {

  public static String process(String n) {
    /** build a condition combination: */
    String newString = "";
    for (int i = 0; i < n.length(); i++) {
      if (n.charAt(i) == '(' || n.charAt(i) == ')' || n.charAt(i) == '[' || n.charAt(i) == ']' 
            || n.charAt(i) == '<' || n.charAt(i) == '>' || n.charAt(i) == '{' || n.charAt(i) == '}') {
        newString += n.charAt(i);
      }
    }
    return newString;
  }


  public static String numForm(String s) {
    String newone = "";
    for (int i = 0; i < s.length(); i++) {
      switch(s.charAt(i)) {
        case '(': newone += "1 ";break;
        case ')': newone += "9 ";break;
        case '[': newone += "2 ";break;
        case ']': newone += "8 ";break;
        case '<': newone += "3 ";break;
        case '>': newone += "7 ";break;
        case '{': newone += "4 ";break;
        case '}': newone += "6 ";break;
      }
    }
    return newone;
  }

  public static int[] intArray(String m) {
    String[] stringArray = m.split(" ");
    int[] intArr = new int[stringArray.length];
    for (int i = 0; i < stringArray.length; i++) {
      intArr[i] = Integer.parseInt(stringArray[i]);
    }
    return intArr;
  }

  public static void printArray (int[] array) {
    for (int n : array) {
      System.out.print(n + " ");
    }
  }

  public static int[] oddPosition (int[] array) {
    int [] oddNumbers = new int[array.length / 2];
    int j = 0;
    for (int i = 0; i < array.length; i++) {
      if ((i + 1) % 2 != 0) {
        oddNumbers[j] = array[i];
        j ++;
      }
    }
    return oddNumbers;
  }

  public static int[] evenPosition (int[] array) {
    int [] evenNumbers = new int[array.length / 2];
    int j = 0;
    for (int i = 0; i < array.length; i++) {
      if ((i + 1) % 2 == 0) {
        evenNumbers[j] = array[i];
        j ++;
      }
    }
    return evenNumbers;
  }

  public static boolean addsUpten (int [] array) {
    boolean conditionSum = false;
    boolean conditionSingle = false;
    for (int i = 0; i < array.length; i++) {
      int d = 0;
      while (i + d < array.length) {
        if (array[i] + array[i+d] == 10) {
          conditionSingle = true;
        }
        conditionSum = (conditionSum || conditionSingle);
        d ++;
      }
    }
    return conditionSum;
  }




  public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int times = sc.nextInt();
    String voider = sc.nextLine();

    for (int i = 0; i < times; i ++) {
      String formula = sc.nextLine();
      String processed = process(formula);

      String numFormed = numForm(processed);
      // System.out.println(numFormed);
      int[] numArray = intArray(numFormed);

      if (numArray.length % 2 != 0) {
        System.out.print("0 ");
      }
      else {
        int[] oddNumbers = oddPosition(numArray);

        int[] evenNumbers = evenPosition(numArray);


        if (addsUpten(oddNumbers) || addsUpten(evenNumbers) == true) {
          System.out.print("0 ");
        }
        else {
          System.out.print("1 ");
        }
      }
    }
  }
}
/**匹配括号
*托尼
*/
导入java.util.*;
公共类解决方案19{
公共静态字符串进程(字符串n){
/**建立一个条件组合:*/
字符串newString=“”;
对于(int i=0;i
正如我所料,它应该可以工作,而且在我输入时确实可以工作:

4
(a+[b*c]-{d/3})
(a + [b * c) - 17]
(((a * x) + [b] * y) + c
auf(zlo)men [gy<psy>] four{s}
4
(a+[b*c]-{d/3})
(a+[b*c)-17]
((a*x)+[b]*y)+c
奥夫(兹洛)人[gy]四{s}

它给我输出:
10001
(1表示它是匹配的,0表示它不是匹配的)。然而,当我输入较长的内容时,如
[^](z){((a)w)}
,它是匹配的,但它给我0。我想知道我判断匹配与否的方法是对的还是错的?我错过了什么?对不起,太长的代码,只是想知道
(“我发现如果一个括号位于奇数位置,那么他的一对括号必须位于偶数位置,反之亦然。”)
这种描述括号匹配的方法是对的还是错的?Thx!

您的方法有一个根本性的问题-它不太支持嵌套

可以通过创建一组括号来解决此问题:

  • 当您看到一个左括号时,将其推到堆栈上
  • 当您看到一个右括号时,您弹出一个左括号,该括号应该与堆栈中的右括号配对
  • 如果堆栈中的对匹配,请继续
  • 如果配对不匹配,或者堆栈为空,则报告不匹配
  • 如果循环结束时堆栈不是空的,也报告不匹配

你的偶数/奇数假设显然是错误的。就拿
(a)
(a)“will first”转换为“()”;”(“是第一位的”)'是第二位。所以一个是奇数,另一个是偶数。怎么了?避免Java循环中的
String+=
-使用。我认为您的条件不仅过于复杂,而且只是必要的,还不够。@greybeard Thx我明白了。您好,非常感谢您为我们提供了非常好的解决方案