2-8 符号配对 (20分)
请编写程序检查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代码
#include<bits/stdc++.h>
using namespace std;
char kuohao[110],zuokuohao[110];
int num1 = 0,num2 = 0;
void output(char x){
if(x == '(')
cout << "NO\n(-?" << endl;
else if(x == '[')
cout << "NO\n[-?" << endl;
else if(x == '{')
cout << "NO\n{-?" << endl;
else if(x == '<')
cout << "NO\n/*-?" << endl;
}
int main(){
string str;
int i;
while(getline(cin,str) && str!="."){ //遍历输入的字符串,只要碰到括号,就将它存入括号栈中
for(i = 0;i < str.length();i++){
if(str[i]=='(' || str[i]==')' || str[i]=='[' || str[i]==']' || str[i]=='{' || str[i]=='}'){
kuohao[num1++] = str[i];
}
if(str[i]=='/' && str[i+1]=='*'){ //将'/*'以'<'的形式存入括号栈中
kuohao[num1++] = '<';
i++;
}
else if(str[i]=='*' && str[i+1]=='/'){ 将'*/'以'>'的形式存入括号栈中
kuohao[num1++] = '>';
i++;
}
}
}
for(i = 0;i < num1;i++)
if(kuohao[i]=='(' || kuohao[i]=='[' || kuohao[i]=='{' || kuohao[i]=='<'){
zuokuohao[num2++] = kuohao[i];
}
else if(kuohao[i]==')'){ //如果左括号栈为空,说明')'为多余的,缺少一个'('
if(num2 == 0){
cout << "NO\n?-)" << endl;
return 0;
}
if(zuokuohao[num2-1] == '(') //如果左括号栈顶为匹配项,将该匹配项弹出栈
num2--;
else { //如果左括号栈顶不是匹配项,那么说明栈顶左括号缺少一个右括号匹配项
output(zuokuohao[num2-1]);
return 0;
}
}else if(kuohao[i]==']'){
if(num2 == 0){
cout << "NO\n?-]" << endl;
return 0;
}
if(zuokuohao[num2-1] == '[')
num2--;
else {
output(zuokuohao[num2-1]);
return 0;
}
}else if(kuohao[i]=='}'){
if(num2 == 0){
cout << "NO\n?-}" << endl;
return 0;
}
if(zuokuohao[num2-1] == '{')
num2--;
else {
output(zuokuohao[num2-1]);
return 0;
}
}else if(kuohao[i]=='>')
{
if(num2 == 0){
cout << "NO\n?-*/" << endl;
return 0;
}
if(zuokuohao[num2-1] == '<')
num2--;
else {
output(zuokuohao[num2-1]);
return 0;
}
}
if(num2 > 0)
output(zuokuohao[num2-1]);
else
cout << "YES" << endl;
return 0;
}