Java语言中的括号标识符

3

如果您能用Java帮我解决这个问题,我将非常感激。

假设有两个字符串,例如String A = "(A+B)+(C)"String B = "((A+B)+(C))",以及String C = (A+B)String D = A+(B+C)String E = (A+(B+C))

如何确定字符串是否完全被括号包围,就像字符串B一样。

例如:boolean flag(String expr) { //如果被括号包围,则返回false,否则返回true }

如果expr = A,flag将返回true

如果expr = B,flag将返回false

如果expr = C,flag将返回false

如果expr = D,flag将返回true

如果expr = E,flag将返回flase

抱歉如果不太清楚,但它应该适用于任何字符串表达式:

假设表达式只包含数字运算符括号

谢谢。感激不尽。


(A+B)被包围,因此应该返回false。 - link_boy
哦,对不起,我把true和false搞反了:你想检测字符串是否没有完全被括号包围。我会更新我的答案。 - Mark Byers
3个回答

4

由于嵌套括号不是正则语言,因此无法使用正则表达式进行操作。

相反,您需要迭代字符串并通过计算开放和关闭括号的数量来跟踪嵌套级别。对于每个打开的括号,将嵌套级别加一。对于每个关闭的括号,将嵌套级别减一。

  • 如果在到达字符串结尾之前达到零(或更少),则返回true。
  • 如果在结尾处达到零,则返回false。
  • 除此以外的任何情况都是不平衡的括号,这种情况只会在输入无效时发生。

以下是一些示例以演示原理:

(A+B)+(C)
11110        TRUE

((A+B)+(C))
12222112210  FALSE

(A+B)
11110        FALSE

A+(B+C)
0            TRUE

(A+(B+C))
111222210    FALSE

*sanely


A+(B+C) 表达式的返回值怎么样?这是一个常规用例吗? - Jiri Patera
@Jiri 不,他不是这样做的,他正在解决一个与你认为应该解决的问题略有不同的问题。这个问题的措辞..不够恰当。 - Voo
Voo,我猜你错了,因为(A)+(B)返回的值与(A+B)不同。在你的解决方案中,它将始终返回相同的值。 - Jiri Patera
@Jiri 你刚才是不是删除了之前的评论,说马克错了,然后换成了完全相同的评论说我错了,因为你仍然不理解马克实际上在做什么/解决什么问题?xX - Voo
我试图拼写你的名字,正确的是"Voo"而不是"Woo",但由于过去已经超过了5分钟,所以无法编辑评论。对于因此引起的删除和混淆表示抱歉。 - Jiri Patera
显示剩余3条评论

1

我在你的情况下看到两个选项。

  1. 使用子字符串方法

示例:

public boolean checkForParanthesis(String str) {
 Integer last = str.length() - 1; // Get number of the last character
 String firstChar = str.substring(0); // Get first character of the string
 String lastChar = str.substring(last); // Get last character of the string
 if (firstChar.equals("(") && lastChar.equals(")")) return false;
 return true
}

使用正则表达式。也许这是一个更好的解决方案。

1
以上三种情况都将返回false。 - link_boy

1

Mark Byers的算法似乎大致是您要寻找的。现在,要将其组合起来,您必须使用forif Java关键字和索引进行操作。以下是一个示例代码。但它不验证表达式,因此在测试无效表达式如A+B)时不会抛出错误(只返回true值)。请自行检查并测试它。希望这能有所帮助...


package test;

public class Main {
public static void main(String[] args) { Main m = new Main(); m.start(); }
private void start() { /* true */ System.out.println(isNotSurrounded("A")); System.out.println(isNotSurrounded("A+B")); System.out.println(isNotSurrounded("A+(B+C)")); System.out.println(isNotSurrounded("(B+C)+D")); System.out.println(isNotSurrounded("A+(B+C)+D")); System.out.println(isNotSurrounded("(A+B)+(C)")); System.out.println(isNotSurrounded("(A)+(B)+(C)")); System.out.println(isNotSurrounded("(A)+((B)+(C))+(D+E+F+(G))")); /* false */ System.out.println(); System.out.println(isNotSurrounded("(A)")); System.out.println(isNotSurrounded("(A+B)")); System.out.println(isNotSurrounded("(A+(B+C))")); System.out.println(isNotSurrounded("((B+C)+D)")); System.out.println(isNotSurrounded("(A+(B+C)+D)")); System.out.println(isNotSurrounded("((A+B)+(C))")); System.out.println(isNotSurrounded("((A)+(B)+(C))")); System.out.println(isNotSurrounded("((A)+((B)+(C))+(D+E+F+(G)))")); }
private boolean isNotSurrounded(String expression) { if (expression.startsWith("(") && expression.endsWith(")") && expression.length() > 2) { int p = 0; for (int i = 1; i < expression.length() - 1; i++) { if (expression.charAt(i) == '(') { p++; } else if (expression.charAt(i) == ')') { p--; } if (p < 0) { return true; } } if (p == 0) { return false; } } return true; } }
代码的输出如下所示:

真
真
真
真
真
真
真
真
假 假 假 假 假 假 假 假

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接