字符串的括号匹配问题有多种解决的方法:
1.使用Stack(栈),对左括符的入栈,再循环判断,右括符是否有对之应的左括符,再出栈,最后判空。
2.使用正则表达式来判断,字符串括号的匹配
3.使用容器来类似stack的功能,这也是我下面所写的。
当然了还有其他的方法,大家可以尽情使用网络,这里我不说大家都懂的^-^。
思维:
在实现之前,先想好自己要怎么实现,需要注意哪些点,避免代码重构,从现在就养成好的习惯。
当然对于大多数人,关键的是先实现匹配问题,接下来再考虑边界问题。
具体代码:
public class Test6 {
public static void main(String[] args) { //主函数是程序执行的起点
String s = ")([(2{2}6)3])"; //需要匹配的字符串括号,自己随意输入
new Match().match(s); //调用match类的match方法
}
}
package com.example.demo.boke;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Match {
public void match(String s) { //match方法需要传入一个String类型的字符串
List<Character> list = new ArrayList<>(); //我使用的是List列表,来进行主要的核心操作,<Character>表明List内的数据类型是Character
Map<Character, Character> map = new HashMap<>(); //方便下面的取值,精减代码
map.put(')', '(');//方便下面的取值,精减代码
map.put(']', '[');//方便下面的取值,精减代码
map.put('}', '{');//方便下面的取值,精减代码
//初始化,定义容器
int a = 0; //传值判断,列表为空,循环在哪里
int b = s.length();//获取参数s的长度,方便数组空间的确定
char[] arrs = new char[b];//建立一个char类数组,拿来存放String的内容
//将要处理的内容存到容器内,方便进行操作
for (int i = 0; i < s.length(); i++) {//for循环将String s的内容存入数组中
arrs = s.toCharArray();//将S的单个字符内容转换成字符数组
}
for (int i = 0; i <= arrs.length - 1; i++) { //循环数组arrs
//判断数组内当前位置的括符是哪一个,是左就存
if (arrs[i] == '(' || arrs[i] == '{' || arrs[i] == '[') {
list.add(arrs[i]);
}
//判断数组内当前位置的括符是哪一个,是左就存,是右就判断
if (arrs[i] == '}' || arrs[i] == ']' || arrs[i] == ')') {
if (list.lastIndexOf(map.get(arrs[i])) != list.size() - 1 || list.isEmpty()) {//判断list内当前最后一个括符是啥,对的上就是移除,否则就报错
System.out.println("符号不匹配");
break;//字符括号匹配失败,直接break跳出循环,到循环外
} else {
list.remove(list.lastIndexOf(map.get(arrs[i])));//单对括号匹配成功,挪出当前匹配成功的括号
}
a = i;//传值判断,列表为空,循环在哪里
}
}
//for循环结束,判断列表内是否为空
if (list.isEmpty() && a == arrs.length - 1) {
System.out.println("符号匹配");
} else {
System.out.println("符号不匹配");
}
}
}
最后你可以将匹配的内容放到一个方法内,也可以写一个类来实例化,当然如果你用接口来封装它那就更加没得说了。保持代码的解耦性,让你的代码看起来逻辑严谨。