第二道題:括號配對問題
阿新 • • 發佈:2018-12-24
這道題著實費了我不少時間(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(); } }