括號配對問題
時間限制:3000 ms | 內存限制:65535 KB
難度:3
描述
現在,有一行括號序列,請你檢查這行括號是否配對。
輸入
第一行輸入一個數N(0<N<=100),表示有N組測試數據。后面的N行輸入多組輸入數據,每組輸入數據都是一個字符串S(S的長度小於10000,且S不是空串),測試數據組數少於5組。數據保證S中只含有"[","]","(",")"四種字符
輸出
每組輸入數據的輸出占一行,如果該字符串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No
樣例輸入
3
[(])
(])
([[]()])
樣例輸出
No
No
Yes
以下代碼實現了主要功能,有不完善的地方...大家可以自己完善。
1 // 2 // main.c 3 // matching 4 // 5 // Created by scandy_yuan on 13-1-4. 6 // Copyright (c) 2013年 Sam. All rights reserved. 7 // 8 9 #include <stdio.h> 10 #include <string.h> 11 #include <stdlib.h> 12 //實際匹配函數 借鑒彈棧入棧操作 13 //str為傳入的字符串,n為字符串的長度 14 void stack(char * str,size_t n) 15 { 16 //創建臨時數組 17 char S[10000] = {0}; 18 //i為循環變量 k記錄臨時數組的下標 19 int i , k = 0; 20 //flag為標記 0表示正常 1表示失敗 21 int flag = 0; 22 23 //有幾個字符就循環多少次 24 for(i = 0; i < n; i++) { 25 //如果字符串的長度不是2的整數倍或者長度為1 26 //肯定不會正常匹配 27 if(n % 2 != 0||n==1) { 28 flag = 1; //將標記置為1 29 break; //直接退出循環 30 } 31 //如果為做括號則入棧 也就是放到臨時數組中 32 if(str[i] == '(' || str[i] == '[') { 33 S[k] = str[i]; 34 k++; //將記錄下標的k向后移動一位 35 } 36 //如果是右括號則開始根據臨時數組中的左括號進行匹配 37 if(str[i] == ')') { 38 //如果此時記錄下標的k已經為0了 39 //說明臨時數組中不會在有和右括號匹配的左括號了 40 if(k==0) { 41 flag = 1; //將標記置1 42 break; //結束循環 43 } 44 //如果S[k-1]是左括號 則正好匹配 45 if(S[k - 1] == '(') { 46 k--;//匹配完成后將k--,相當於將左括號彈出 47 }else{ 48 //否則沒有匹配的左括號,將標記置1 49 flag = 1; 50 } 51 } 52 //同上小括號匹配方式 53 if(str[i] == ']') { 54 if(k==0) { 55 flag = 1; 56 break; 57 } 58 if(S[k - 1] == '[') { 59 k--; 60 }else{ 61 flag = 1; 62 } 63 } 64 } 65 //循環結束后 如果k==0並且flag==0 說明正好完全匹配 66 if(k==0&&flag==0) { 67 printf("YES!\n"); 68 //否則 沒有完全匹配 69 } else{ 70 printf("No!\n"); 71 } 72 } 73 74 //程序執行函數 75 //進行開始的一些初始化工作 76 void matching() 77 { 78 int count ; 79 printf("請輸入測試次數(小於5):"); 80 scanf("%d", &count); 81 //定義一個可變長字符串數組 需要C99標准 82 char S[count][10000]; 83 for(int i = 0; i < count; i++) { 84 printf("請輸入第%d組測試數據:", i + 1); 85 scanf("%s", S[i]); 86 } 87 88 printf("開始匹配...\n"); 89 //輸入幾個字符串就循環調用幾次匹配函數 90 for(int i = 0; i < count; i++) { 91 stack(S[i],strlen(S[i])); 92 } 93 94 } 95 96 int main(int argc, const char * argv[]) 97 { 98 99 // insert code here... 100 matching(); 101 return 0; 102 }