在Java的表达式中分隔符有左分隔符("(","{","[",""),要分情况讨论:①栈为空,即没有遇到左分隔符或者之前的分隔符都已经完全匹配好了,那么很明显此时这个右分隔符是没有一个左分隔符与之匹配的,就像"(())]“②栈不为空,但是右分隔符与栈顶的左分隔符并不匹配,那么也很明显此时是不匹配的,就像”((]"③栈不为空且此时右分隔符与栈顶的左分隔符是匹配的,那么栈顶的左分隔符就可以出栈了
链栈linkStack的实现可以参考:https://blog.csdn.net/qq_52486831/article/details/120795153
package linkStack;
public class SignMatch {
// 判断表达式的左右分隔符是否匹配
public boolean signMatch(String str) throws Exception {
if (str != null && !"".equals(str)) {
boolean flag = true;
//我习惯使用链栈,使用顺序栈也是一样的
linkStack stack = new linkStack();
for (int i = 0; i < str.length(); i++) {
//接受字符串对应位置的字符,方便后面进行字符串的拼接
char c = str.charAt(i);
String s = String.valueOf(c);
System.out.print(s+" ");
//扫描遇到空格直接跳过
if (" ".equals(s)) {
continue;
}
//特殊一点的分隔符有"",这两个分隔符长度为2,其余的分隔符长度都为1,所以要单独讨论,如果遇到要进行字符串的拼接,同时要跳过一个字符
if ("/".equals(s) && i < str.length() - 1 && "*" .equals (String.valueOf(str.charAt(i + 1)))) {
s = s.concat(String.valueOf(str.charAt(i + 1)));
++i;
} else if ("*".equals(s) && i < str.length() - 1 && "/" .equals (String.valueOf(str.charAt(i + 1))))
s = s.concat(String.valueOf(str.charAt(i + 1)));
++i;
}
if (isLeftSign(s)) {
System.out.print( "left ");
stack.push(s);
}
if (isRightSign(s)) {
System.out.print( "right ");
if(stack.isEmpty()||!match(stack.pop().toString(),s)){
flag = false;
break;
}
}
}
if (!stack.isEmpty())
flag = false;
return flag;
} else
throw new Exception("表达式为空");
}
// 判断是否是左分割符:{,(,[,
public boolean isRightSign(String str) {
boolean flag = false;
if (")".equals(str) || "]".equals(str) || "}".equals(str) || "*/".equals(str))
flag = true;
return flag;
}
// 判断分隔符是否匹配
public boolean match(String left, String right) {
boolean flag = false;
if (("(".equals(left)&&")".equals(right)) || ("{".equals(left)&&"}".equals(right)) || ("[".equals(left)&&"]".equals(right)) || ("".equals(right)))
flag = true;
return flag;
}
}
提供的测试类如下:
package linkStack;
public class Demo_SignMatch {
public static void main(String[] args) throws Exception{
SignMatch sign = new SignMatch();
String str1 = "(())abc{[)(]}";
if(sign.signMatch(str1)) {
System.out.println(str1 + "符号匹配");
}
else System.out.println(str1 + "符号不匹配");
String str2 = "(()))abc{[]}";
if(sign.signMatch(str2)) {
System.out.println(str2 + "符号匹配");
}
else System.out.println(str2 + "符号不匹配");
String str3 ="(()()abc{[]}";
if(sign.signMatch(str3)) {
System.out.println(str3 + "符号匹配");
}
else System.out.println(str3 + "符号不匹配");
String str4 ="(( ))abc{ []}";
if(sign.signMatch(str4)) {
System.out.println(str4 + "符号匹配");
}
else System.out.println(str4 + "符号不匹配");
String str5 ="/ */";
if(sign.signMatch(str5)) {
System.out.println(str5 + "符号匹配");
}
else System.out.println(str5 + "符号不匹配");
String str6 =" ";
if(sign.signMatch(str7)) {
System.out.println(str7 + "符号匹配");
}
else System.out.println(str7 + "符号不匹配");
}
}
代码中也可能存在部分问题或者有能够进一步优化的地方,本人也是编程菜鸟一枚,初学数据结构很有可能一些地方理解也有问题,希望大佬们能提出来批评指正



