1. 程式人生 > >初學程式設計練習題:括號配對問題(Java)

初學程式設計練習題:括號配對問題(Java)

*問題描述:
現在,有一行括號序列,檢查這行括號是否配對。

輸入:第一行輸入一個數N,表示有N組測試資料,N>0且N<=100。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料組數少於5組。資料保證S中只含有”[“,”]”,”(“,”)”四種字元
輸出:
每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出“Yes”,如果不配對則輸出“No”*

示例:
輸入:
4
[(]
{}
{[)]{}[
([{}])

輸出:
No
Yes
No
No
Yes

解決思路:對於這一問題,可以使用棧的思想來解決,將字串中的每個字元提取,遇到左括號‘{’、‘[’、‘(’,便將其入棧,如果遇到右括號,便將棧頂字元和其配對,如果不配對,則該字串不滿足要求,如果配對成功,便將棧頂字元彈出棧即可。
這裡需要注意的幾點是:
1.當字串的長度是奇數時,可以直接判斷為不匹配。(不過好像對時間影響不大,不加也可以)
2.當遇到右括號時,需要先判斷是否棧為空,不然就GG了,想想整個字串只有右括號的情況(或者左括號比右括號少)。
3.當然,還要考慮下整個字串只有左括號的情況(或者右括號比左括號少),即匹配工作做完了,還要判斷下棧是否為空(如果裡面還有左括號在等著也GG啊)
OK,下面附上程式碼(我也是初學者啊,所以程式開銷並不完美,註釋都是中文的…只是解決了問題,歡迎大神指正)

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args){
        Scanner input=new Scanner(System.in); 
        int N=input.nextInt();
        input.nextLine();//清空輸入
        String[] p=new String[N];//用來標註每一行字串是否匹配
        String[] s=new String[N];//接收字串
        for
(int i=0;i<N;i++) s[i]=input.nextLine(); for(int i=0;i<N;i++) if(Match(s[i]))//呼叫函式,判斷是否匹配 p[i]="Yes"; else p[i]="No"; for(int i=0;i<N;i++) System.out.println(p[i]); } public static boolean Match
(String s){ if(s.length()%2!=0) return false;//字串是奇數,不匹配 char[] stack=new char[s.length()]; int top=-1; for(int i=0;i<s.length();i++){ if(s.charAt(i)=='{'||s.charAt(i)=='['||s.charAt(i)=='(') stack[++top]=s.charAt(i); else if(s.charAt(i)==']'){ if(top==-1||stack[top]!='[')//先判斷棧是否為空再匹配,top==-1要在前 return false; else top--; } else if(s.charAt(i)==')'){ if(top==-1||stack[top]!='(') return false; else top--; } else if(s.charAt(i)=='}'){ if(top==-1||stack[top]!='{') return false; else top--; } } if(top!=-1) return false;//棧不為空 return true; } }