括弧配對問題時間限制:3000 ms | 記憶體限制:65535 KB難度:3
-
描述
-
現在,有一行括弧序列,請你檢查這行括弧是否配對。
-
輸入
-
第一行輸入一個數N(0<N<=100),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料群組數少於5組。資料保證S中只含有"[","]","(",")"四種字元
-
輸出
-
每組輸入資料的輸出佔一行,如果該字串中所含的括弧是配對的,則輸出Yes,如果不配對則輸出No
-
範例輸入
-
3[(])(])([[]()])
-
範例輸出
-
NoNoYes
C++版:
#include<cstdio>#include<cstring>using namespace std;struct stack{char a[10001];int top;}b;char d[10001];void push(char c){b.a[b.top]=c;b.top++;}void pop(char c){b.top--;}int main(){int n;scanf("%d",&n);//cin>>n;while(n--){scanf("%s",d);//cin>>d;b.top=0;push(d[0]);for(int i=1; i<strlen(d); i++){if(d[i]==')'&&b.a[b.top-1]=='(' || d[i]=='}'&&b.a[b.top-1]=='{' || d[i]==']'&&b.a[b.top-1]=='[' ){pop(d[i]);}else{push(d[i]);}}if(b.top==0){printf("Yes\n");//cout<<"Yes"<<endl;}else{printf("No\n");//cout<<"No"<<endl;}}return 0;}
java版:
import java.util.Scanner;public class Main {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubScanner input = new Scanner(System.in);int num = input.nextInt();int i=0; String arr[] = new String[num];for(i=0; i<num; i++){arr[i] = input.next();}i=0;while(i < num){String flaot = "No";int b = to_make(arr[i]);if(b == 1){flaot = "Yes";}System.out.println(flaot);i++;}}public static int to_make(String s){int slen = s.length();if(slen%2 != 0 && slen > 1) return 0;if(s.charAt(0) == ')'||s.charAt(0) == '}'||s.charAt(0) == ']') return 0;char []ch = new char [slen/2];int j=0; char CA = '-';for(int i=0; i<slen; i++){char ca = s.charAt(i);if(ca == '('||ca == '{'||ca == '['){ch[j] = ca;}else{if(j<=0) return 0;if(ca == ')'){CA = '(';}else if(ca == '}'){CA = '{';}else if(ca == ']'){CA = '[';}if(ch[j-1] != CA) return 0;else{j -= 2;}}j++;}if(j != 0) {return 0;}return 1;}}
java的棧運用:
import java.util.Scanner;import java.util.Stack;public class kuohao {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n= sc.nextInt();//3條測試資料資料Stack<Character> stack = null;while(n!=0){//從控制台讀入一個測試字串[]() [(])String str = sc.next();//如果該輸入字串為奇數,說明不匹配if(str.length() % 2 == 1){System.out.println("No");}else{//說明字元是偶數stack = new Stack<Character>();//遍曆第一條測試字串[]() [(])for(int i=0;i<str.length();i++){if(stack.isEmpty()){//如果棧是空的stack.push(str.charAt(i));}else if(stack.peek() == '[' && str.charAt(i) == ']' || stack.peek() == '(' && str.charAt(i) == ')'){//說明此時棧中字元不是空的,並且符合,stack.pop();}else{stack.push(str.charAt(i));}}if(stack.isEmpty()){//如果棧是空的,說明括弧匹配System.out.println("Yes");}else{//說明棧不為空白,括弧不匹配System.out.println("No");}}n--;}}}