括號匹配程序


括號配對問題
時間限制: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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM