括号匹配程序


括号配对问题
时间限制: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