有效字符串满足:
左括号必须相同类型的右括号闭合
左括号必须已正确的顺序闭合
每个右括号必须有一个相同类型的左括号、
解法一:
import java.util.Stack;
public class demo1 {
public boolean WTo(String s) {
Stack<Character> stack=new Stack();
//遍历String,放入char中
for (int i = 0; i <s.length() ; i++) {
char cr=s.charAt(i);
//判断cr是否左括号,左括号则添加,右括号则判断栈是否为空
if(cr=='('||cr=='['||cr=='{'){
stack.push(cr);
}
else if(cr==')'||cr==']'||cr=='}'){
if(stack.empty()){
return false;
}else{
//不为空则拿出顶部元素
char cleft=stack.peek();
if(cleft=='('&&cr==')'||cleft=='['&&cr==']'||cleft=='{'&&cr=='}'){
//删除继续遍历
stack.pop();
}else{
return false;
}
}
}
}
//如果栈不为空,左右不平均
if(!stack.empty()){
return false;
}else {
return true;
}
}
public static void main(String[] args) {
demo1 d1 = new demo1();
Boolean D1 =d1.WTo("()");
System.out.println(D1);
demo1 d2 = new demo1();
Boolean D2 =d2.WTo("(}");
System.out.println(D2);
demo1 d3 = new demo1();
Boolean D3 =d3.WTo("(){}[]");
System.out.println(D3);
}
}
解法二:
import java.util.Scanner;
public class demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String next = scanner.next();
char[] charArray = next.toCharArray();
demo2 clent = new demo2();
Boolean d = clent.D(charArray);
System.out.println(d);
}
Boolean D(char[] charArray){
int len=charArray.length;
//判断字符长度是否为2的倍数,因为括号是成对的
if(len%2==0){
//遍历数组
for(int i=0,j=0;i<len/2;i++){
String c=charArray[j]+"";
//判断左括号是否与右括号相同
if(c.equals("[")){
if((charArray[++j]+"").equals("]")){
//为了下次进来拿到的是新的右半括号
j++;
}
else{return false;}
}
else if(c.equals("{")){
if((charArray[++j]+"").equals("}")){
j++;
}
else{return false;}
}
else if(c.equals("(")){
if((charArray[++j]+"").equals(")")){
j++;
}
else{return false;}
}
else{
return false;
}
}
return true;
}
return false;
}
}