PAT 符号配对
2016-03-24 21:21
405 查看
5-4 符号配对 (20分)
请编写程序检查C语言源程序中下列符号是否配对:
请编写程序检查C语言源程序中下列符号是否配对:
/*与
*/、
(与
)、
[与
]、
{与
}。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES,否则输出
NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出
?-右符号;如果缺少右符号,则输出
左符号-?。
输入样例1:
void test() { int i, A[10]; for (i=0; i<10; i++) /*/ A[i] = i; } .
输出样例1:
NO /*-?
输入样例2:
void test() { int i, A[10]; for (i=0; i<10; i++) /**/ A[i] = i; }] .
输出样例2:
NO ?-]
输入样例3:
void test() { int i double A[10]; for (i=0; i<10; i++) /**/ A[i] = 0.1*i; } .
输出样例3:
YES
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <stack> using namespace std; char a[1000], s[1000], b[1000], b1[1000]; stack<char> ss; int is_op(char c){ if( c == '(' || c == ')' || c == '{' || c == '}' || c == '[' || c == ']') return 1; return 0; } int if_com(char s, char t){ if(s == '(' && t == ')') return 1; else if(s == '{' && t == '}') return 1; else if(s == '[' && t == ']') return 1; else if(s == '<' && t == '>') return 1; return 0; } int main(){ int k = 0, n, count, i, j; while(1){ if(a[0] == '.' && strlen(a) == 1) break; scanf("%s", &a); getchar(); int len = strlen(a); for( i = 0; i < len; ++i){ if(is_op(a[i])) s[k++] = a[i]; else if((a[i] == '/' && a[i + 1] == '*')){ s[k++] = '<'; ++i; } else if((a[i] == '*' && a[i + 1] == '/')){ s[k++] = '>'; ++i; } } } n = k; count = 0; /* for( i = 0; i < n; ++i) printf("%c", s[i]); printf("\n\n");*/ for(i = 0; i < n; ++i){ if(s[i] == '(' || s[i] == '{' || s[i] == '[' || s[i] == '<') ss.push(s[i]); else if(!ss.empty()){ if(if_com(ss.top(), s[i]) == 1){ ss.pop(); } else ss.push(s[i]); } else ss.push(s[i]); } if(ss.empty()){ printf("YES\n"); } else { k = 0; while(!ss.empty()){ b[k++] = ss.top(); ss.pop(); } n = k; for(i = 0; i < n; ++i) b1[n - i - 1] = b[i]; int tt = n - 1; for(i = 0; i < tt; ++i){ for(j = tt; j > i; j--){ if(if_com(b1[i], b1[j]) || if_com(b1[j], b1[i])){ b1[i] = '@'; b1[j] = '@'; tt = j - 1; } } } char aa; for(i = 0; i < n; ++i) { if(b1[i] != '@'){ aa = b1[i]; break; } } if(aa == '(') printf("NO\n(-?\n"); if(aa == '[') printf("NO\n[-?\n"); if(aa == '{') printf("NO\n{-?\n"); if(aa == '<') printf("NO\n/*-?\n"); if(aa == ')') printf("NO\n?-)\n"); if(aa == ']') printf("NO\n?-]\n"); if(aa == '}') printf("NO\n?-}\n"); if(aa == '>') printf("NO\n?-*/\n"); } return 0; }
相关文章推荐
- Linux GCC常用命令
- HDOJ 1017 A Mathematical Curiosity
- 剑指offer 11二进制中1的个数
- 第三周项目四(1)-百钱百鸡问题
- HDOJ 1017 A Mathematical Curiosity
- JAVA之大数处理,有简单方法不用是sb
- 狄拉克δ函数的导数
- java socket编程
- Mybatis开发原始Dao(即有Dao的实现)
- 怎么使得文本框在点击的时候,边框的颜色变成绿色
- 推荐算法(一)——音乐歌单智能推荐
- java main方法调用类的实例化方法疑问
- 深入理解C指针学习笔记(四)
- JS中自己实现一个HashMap
- 字符串反转
- PAT 求前缀表达式的值
- Linux下如何查看计算机的配置信息(cpu物理个数、几核)
- Android总结:Activity Intent Flags、Task相关属性及利用Intent属性调用系统app
- HTML5之响应式图片项目实战
- [BZOJ3144][HNOI2013]切糕