最近比较忙,前几天实现的一些小算法没时间写到博客上面,今天有时间了,把它整理出来,跟大家分享。
废话少说,进入正题。
题目描述:给定一字符串,其内包含“()”,“{}”和“[]”三种括号,请设计算法检验括号是否正确嵌套(如果字符串内不包含括号元素,按未正确嵌套处理)
首先给出代码,接下来我会对代码进行分析。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str1="";
while(in.hasNext()){
str1=in.nextLine();
System.out.println(parse(str1));
}
}
public static boolean parse(String s){
ArrayList<Character> result=new ArrayList<Character>();
if (s.contains("(")||s.contains("{")||s.contains("[")||s.contains("]")||s.contains("}")||s.contains(")")) {
for(int i=0;i<s.length();i++){
if (s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['||s.charAt(i)==']'||s.charAt(i)=='}'||s.charAt(i)==')') {
result.add(s.charAt(i));
}
}
if (result.size()%2!=0) {
return false;
}else{
int pairNum=result.size()/2;
int count=result.size()/2;
while(pairNum>0&&count>0){
for(int i=0;i<result.size()-1;i++){
if (result.get(i)=='('&&result.get(i+1)==')') {
result.remove(i);
result.remove(i);
pairNum--;
break;
}
if (result.get(i)=='['&&result.get(i+1)==']') {
result.remove(i);
result.remove(i);
pairNum--;
break;
}
if (result.get(i)=='{'&&result.get(i+1)=='}') {
result.remove(i);
result.remove(i);
pairNum--;
break;
}
}
count--;
}
if (result.size()==0) {
return true;
}else {
return false;
}
}
}
return false;
}
}
本代码采用ArrayList存储括号字符,即遍历字符串字符,每当遇到括号元素时,就将其加入该集合。
接下来就是对ArrayList进行处理了
1.如果字符串中不包含括号元素,直接返回false;如果包含括号元素,就将该括号元素加入ArrayList集合;
2.如果该ArrayList的大小,即size()不为偶数,那么说明括号一定没有正确嵌套。因为我们知道,括号都是成对出现的;
3.如果该ArrayList的大小,即size()为偶数,那么进行如下处理:
如果集合内的某一元素和其相邻元素能够组成括号对,那么就从该集合中,将该成对括号清除。接下来,再继续如此操作,进行count(size()/2)次后,如果该集合内仍然有元素,即size()大于0,那么说明括号没有正确嵌套。等于0,说明括号正确嵌套。
以上是个人愚见,如有不妥支持,还望各位看官批评指正。