1. 程式人生 > >第二道題:括號配對問題

第二道題:括號配對問題

這道題著實費了我不少時間(90分鐘==。),問題的關鍵是怎麼全面判斷括號是否配對,我原來的思路是比較各個括號的個數,毫無疑問,這會漏掉許多情況,比如 ] [ 、[ ( ] )…然後我就打算直接比較字串,由兩邊到中間,一 一比較,但這仍然會漏掉一些情況,比如 ([]) 。窮途末路的我不得不求助搜尋引擎,發現堆疊是個好東西啊(雖然之前在Java裡面沒用過,但看完文件後,很快就上手了),有了這個結構,這個問題就很好解決了!
我先判斷字串長是否為偶數,如果是偶數,就用堆疊進行判定,然後每次迴圈判斷棧頂字元是否與當前字元一致(peek),若一致,就彈出(pop),最後判斷堆疊是否為空(其實和很多人的思路都差不多,我也是看了一眼別人的程式碼才有思路的 :) ,但是這些程式碼可是我自己獨立完成的,2333)

    import java.util.Scanner;
    import java.util.Stack;

public class Main {

    public static void main(String[] args) {
        Scanner input =new Scanner(System.in);
        Stack<Character> s = new Stack<Character>();
        int n = input.nextInt();
        input.nextLine();
        String[] a = new String[n];
        for(int i=0;i<n;i++){
            a[i]=input.nextLine();
        }
        for(int i=0;i<n;i++){
            if(a[i].length()%2!=0){
                System.out.println("No");
            }else {
                for(int j=0;j<a[i].length();j++){
                    if(s.isEmpty()){
                        s.push(a[i].charAt(j));
                    }else if((s.peek()=='['&&a[i].charAt(j)==']')||(s.peek()=='('&&a[i].charAt(j)==')')){
                        s.pop();
                    }
                    else {
                        s.push(a[i].charAt(j));
                    }

                }
                if(s.isEmpty()){
                    System.out.println("Yes");
                }else {
                    System.out.println("No");
                }
                s.clear();
            }

        }


        input.close();
    }

}