请编写程序检查 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
思路: 首先, 个人认为, 这道题用栈是实现不了的. 下图 AC 代码运行出来的结果, 难道不应该是 {-? 吗???
然后就是我个人的思路, 声明一个足够长的 char 数组 data , 按出现的先后顺序来存储 /* */,( ),[],{ } 这些符号, 遇到其他符号, 直接跳过
例如 void ( { ]
void 和空格直接跳过,
data[6] 存储 '(';
data[8] 存储 '{';
注意, 第 10 位为右半部分符号 ']', 此时从第 9 位, 倒序遍历 data , 若出现与之对应的左半部分符号, 将左半部分符号删除, 即 data[i]=NULL; 若未出现, 将右半部分符号存入第 10 位, 以此方法, 直到将输入语句遍历
最后从头遍历 data 直到出现第一个不为 NULL 的数据, 输出与之相对的部分, 若 data 全为空输出 "YES"
代码:
- #include<iostream>
- #include<vector>
- #include<string>
- using namespace std;
- vector<char> v;
- int main(){
- string tem;
- char data[105] = { NULL };
- int i, j;
- while (getline(cin,tem)&&tem!="."){
- for (i = 0; i <tem.size(); i++)
- v.push_back(tem[i]);
- }
- for (i = 0; i < v.size(); i++) {
- if (v[i] == '('|| v[i] == '['|| v[i] == '{')
- data[i] = v[i];
- else if ((i+1)<v.size()&&v[i] == '/'&&v[i + 1] == '*'){
- data[i] = v[i];
- i++;
- }
- else if ((i + 1) < v.size() && v[i] == '*'&&v[i + 1] == '/') {
- for (j = i - 1; j>= 0; j--) {
- if (data[j] == '/') {
- data[j] = NULL;
- break;
- }
- }
- if(j==-1)
- data[i] = v[i];
- i++;
- }
- else if (v[i] == '}') {
- for (j = i - 1; j>= 0; j--) {
- if (data[j] == '{') {
- data[j] = NULL;
- break;
- }
- }
- if (j == -1)
- data[i] = v[i];
- }
- else if (v[i] == ']') {
- for (j = i - 1; j>= 0; j--) {
- if (data[j] == '[') {
- data[j] = NULL;
- break;
- }
- }
- if (j == -1)
- data[i] = v[i];
- }
- else if (v[i] == ')') {
- for (j = i - 1; j>= 0; j--) {
- if (data[j] == '(') {
- data[j] = NULL;
- break;
- }
- }
- if (j == -1)
- data[i] = v[i];
- }
- }
- for (i = 0; i < 105; i++) {
- if (data[i] != NULL) {
- cout << "NO" << endl;
- if (data[i] == '/')
- cout << "/*-?" << endl;
- else if (data[i] == '{')
- cout << "{-?" << endl;
- else if (data[i] == '[')
- cout << "[-?" << endl;
- else if (data[i] == '(')
- cout << "(-?" << endl;
- else if (data[i] == '*')
- cout << "?-*/" << endl;
- else if (data[i] == '}')
- cout << "?-}" << endl;
- else if (data[i] == ']')
- cout << "?-]" << endl;
- else if (data[i] == ')')
- cout << "?-)" << endl;
- break;
- }
- //cout << data[i];
- }
- if (i==105)
- cout << "YES" << endl;
- system("pause");
- return 0;
- }
来源: http://www.bubuko.com/infodetail-3216271.html