括号匹配(栈Stack的使用)
蒜头君在纸上写了一个串,只包含'('
和')'
。一个'('
能唯一匹配一个')'
,但是一个匹配的'('
必须出现在')'
之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。
输入格式
一行输入一个字符串只含有'('
和')'
,输入的字符串长度不大于50000。
输出格式
如果输入括号不能匹配,输出一行"No"
,否则输出一行"Yes"
,接下里若干行每行输出 2 个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 1 开始)。你可以按照任意顺序输出。
样例输入1
(())
样例输出1
Yes 1 4 2 3
样例输入2
()()
样例输出2
Yes 1 2 3 4
package 计蒜客; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import java.util.Stack; public class 括号匹配 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); String str=scan.next(); Stack<Character> stack=new Stack<Character>(); HashMap<Integer, Integer> map=new HashMap<Integer, Integer>(); boolean flag=true; int ii=0; for(int i=0;i<str.length();i++){ if(str.charAt(i)=='('){ stack.push('('); ii++; } else{ if(stack.size()==0){ flag=false; break; } stack.pop(); ii=ii+2; } } StringBuffer sb=new StringBuffer(str); if(stack.size()>0){ flag=false; } if(flag==true){ System.out.println("Yes"); for(int i=1;i<sb.length();i++){ if(sb.charAt(i)==')'){ for(int j=i-1;j>=0;j--){ if(sb.charAt(j)=='('){ map.put(j+1, i+1); sb.setCharAt(j, ' '); sb.setCharAt(i, ' '); //System.out.println(sb); break; } } } } for(Map.Entry<Integer, Integer> entry:map.entrySet()){ System.out.println(entry.getKey()+" "+entry.getValue()); } }else{ System.out.println("No"); } } }