-- 问题描述:
给定一个字符串,里边可能包含"()"小括号和其他字符,请编写程序检查该字符串的中的小括号是否成对出现。
例如: "(上海)(长安)":正确匹配
"上海((长安))":正确匹配
"上海(长安(北京)(深圳)南京)":正确匹配
"上海(长安))":错误匹配
"((上海)长安":错误匹配
-- 分析:
1.创建一个栈用来存储左括号
2.从左往右遍历字符串,拿到每一个字符
3.判断该字符是不是左括号,如果是,放入栈中存储
4.判断该字符是不是右括号,如果不是,继续下一次循环
5.如果该字符是右括号,则从栈中弹出一个元素t;
6.判断元素t是否为null,如果不是,则证明有对应的左括号,如果不是,则证明没有对应的左括号
7.循环结束后,判断栈中还有没有剩余的左括号,如果有,则不匹配,如果没有,则匹配
-- 代码:
public class BracketsMatch {
public static void main(String[] args) {
String str = "(fdafds(fafds)())";
boolean match = isMatch(str);
System.out.println(str + "中的括号是否匹配:" + match);
}
/**
* 判断str中的括号是否匹配
*
* @param str 括号组成的字符串
* @return 如果匹配,返回true,如果不匹配,返回false
*/
public static boolean isMatch(String str) {
// 创建一个栈存储左括号
Stack<String> chars = new Stack<>();
// 从左往后遍历字符串
for(int i = 0;i < str.length();i++) {
// 拿到一个字符将其转换为字符串
String currChar = str.charAt(i) + "";
if(currChar.equals("(")) {
// 如果是左括号,将其加入栈中
chars.push(currChar);
}else if(currChar.equals(")")) {
// 如果是右括号,从栈中弹出一个左括号
String t = chars.pop();
// 如果t为null,说明没有与之匹配的左括号
if(t == null) {
return false;
}
}
}
// 循环结束后,如果栈中为空则说明匹配,如果不为空说明不匹配
return chars.isEmpty() ? true : false;
}
}
-- 运行效果图:
@ 以上内容属于个人笔记