package com.war.acm;
import java.util.Stack;
/**
括号配对问题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),
测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
思路:
这道题的关键在于 栈的特性 每次栈存入一个元素 叫做压栈,栈顶就是新的元素 。
栈可以保证每次都是最后一个左括号去和第一个右括号去匹配。 匹配正确 就代表栈是空的
只要保证栈存的都是左括号,一旦不是栈顶左括号匹配的右括号 就不匹配
* @ClassName Title2
* @Description TODO
* @Author .abbeyleix
* @Date 2019/10/12 0012 上午 3:52
* @Version 1.0
**/
public class Title2 {
public void mateStr(String str){
Stack<Character> stack = new Stack();
if(str.length() %2 != 0){ // 如果字符串长度不是偶数就没必要下一步了
System.out.println("No");
}else{
for (int i = 0; i < str.length() ; i++) {
if(stack.isEmpty()){
if (str.charAt(i) == ']' || str.charAt(i) == ')'){
//如果字符串第一个就是右括号就不需要循环下去了
System.out.println("No");
return;
}
stack.push(str.charAt(i));
}else if((stack.peek() =='[' && str.charAt(i) == ']') ||(stack.peek() =='(' && str.charAt(i) == ')')){
//这就说明 栈的顶部是{ 和现在str 中去出来的 } 是一对; 把存在栈里的 左半部分出栈
stack.pop();
}else {
if (str.charAt(i) == ']' || str.charAt(i) == ')'){
//如果字符串中的右括号和栈顶的左括号不匹配 就不需要循环下去了
System.out.println("No");
return;
}
//存入左括号
stack.push(str.charAt(i));
}
}
if(stack.isEmpty()){
//为空说明 是一对一对的
System.out.println("Yes");
}else{
System.out.println("No");
}
}
}
}