请编写程序检查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;
}