PTA 7-2 符号配对(栈模拟)

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

题意

如上

题解

这里用栈存符号,遇到右括号判断栈顶元素是否为对应的左括号,详细看代码

这里给几个特殊样例

1./*

2./**/*/

代码

 #include<bits/stdc++.h>
using namespace std; stack<char> sc;
int flag=;
int check(char ch)
{
if(!sc.empty())
{
char uh=sc.top();
if(uh=='('&&ch==')')sc.pop();
else if(uh=='['&&ch==']')sc.pop();
else if(uh=='{'&&ch=='}')sc.pop();
else if(uh=='*'&&ch=='*')sc.pop();
else
{
printf("NO\n");
if(uh=='(')printf("(");
if(uh=='[')printf("[");
if(uh=='{')printf("{");
if(uh=='*')printf("/*");
printf("-?\n");//少右
flag=;
}
}
else
{
printf("NO\n");
printf("?-");//少左
if(ch==')')printf(")");
if(ch==']')printf("]");
if(ch=='}')printf("}");
if(ch=='*')printf("*/");
flag=;
}
}
int main()
{
char a[];
for(;;)
{
gets(a+);
if(a[]=='.')break;
if(flag==)continue;
for(int i=;a[i];i++)
{
char ch=a[i],nh=a[i+];//ch当前,nh下一个
if(ch=='('||ch=='['||ch=='{')//左
sc.push(ch);
else if(ch=='/'&&nh=='*')//这里特判下/*的情况
sc.push('*'),i++;
else if(ch==')'||ch==']'||ch=='}'||ch=='*'&&nh=='/')//右
{
if(ch=='*'&&nh=='/')i++;//这里特判下*/的情况
check(ch);
}
if(flag==)break;//如果不行直接跳出
}
}
if(!sc.empty()&&flag)check(' ');//判断只有1个符号的情况
if(flag)printf("YES\n");
return ;
}
上一篇:IIS7 / IIS7.5 URL 重写 HTTP 重定向到 HTTPS


下一篇:HDU 5875 Function -2016 ICPC 大连赛区网络赛