题目:判定字符串中括号({}()[]
)的对称性
示例1:
输入:abd(sss[ssdfd])
输出:true
示例2:
输入:abd(dcd(cdbh[])
输出:false
解法思路:利用Stack栈先进先出特性
stack.peek()与stack.pop()区别
peek能获取到栈顶数据不会移除栈,pop获取到栈顶数据会移除栈
代码:
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String s = in.nextLine();
boolean bool = isParenthesesValid(s);
System.out.println(bool);
}
private static int whatParentheses(char ch) {
switch (ch) {
case '(':
return -1;
case '[':
return -2;
case '{':
return -3;
case ')':
return 1;
case ']':
return 2;
case '}':
return 3;
}
return 0;
}
private static boolean isParenthesesValid(String s) {
// 字符串为空
if (s == null) {
return false;
}
int length = s.length();
Stack<Character> stack = new Stack<>();
// 存储遍历的字符
char ch;
// 存储字符转换后的数字
int parentNum;
// 记录下括号出现的次数
int count = 0;
for (int i = 0; i < length; i++) {
ch = s.charAt(i);
parentNum = whatParentheses(ch);
if (parentNum < 0) {
count++;
// <0表示这是个左括号
stack.push(ch);
} else if (parentNum > 0) {
count++;
// >0表示这是个右括号
if (stack.isEmpty()) {
// 右括号左边没有左括号的特殊情况
return false;
}
if (parentNum + whatParentheses(stack.peek()) == 0) {
// 栈顶是对应的左括号
stack.pop();
} else {
return false;
}
} else {
// =0 这不是一个括号,不管
}
}
// 字符串中有括号且栈最后被清空了,表示括号成对出现且有效
if (count > 0 && stack.isEmpty()) {
return true;
}
return false;
}
}
运行结果:
abc(dvvb{nvfv}
false