初學程式設計練習題:括號配對問題(Java)
阿新 • • 發佈:2018-12-28
*問題描述:
現在,有一行括號序列,檢查這行括號是否配對。
輸入:第一行輸入一個數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;
}
}