c语言 符号配对 20 分,7-3 符号配对 (20 分)

7-3 符号配对 (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

#include

#define OK 1

#define ERROR 0

#define OVERFLOW -2

using namespace std;

typedef long long ll;

typedef int Status;

typedef struct{

char *base;

char *top;

int StackSize;

}SqStack;

Status InitStack(SqStack&S){

S.base = (char*)malloc(110*sizeof(char));

if(!S.base) return OVERFLOW;

S.top = S.base;

S.StackSize = 110;

return OK;

}

Status push(SqStack &S,char e){

if(S.top - S.base==S.StackSize) return ERROR;

*S.top++ = e;

return OK;

}

Status pop(SqStack&S,char e){

if(S.top==S.base)

return ERROR;

e = *--S.top;

return OK;

}

char GetTop(SqStack S){

if(S.top!=S.base) return *(S.top-1);

}

bool StackEmpty(SqStack&S){

if(S.top==S.base) return true;

return false;

}

int main()

{

//freopen("i.txt","r",stdin);

char s[110],str[110];

char c;

int cnt = 0;

while(scanf("%s",str)!=EOF&&str[0]!='.'){

for(int i=0;str[i];i++){

if(str[i]=='('||str[i]=='{'||str[i]=='['||str[i]==')'||str[i]=='}'||str[i]==']')

s[cnt++] = str[i];

else if(str[i]=='/'&&str[i+1]=='*'){

s[cnt++] = str[i];

s[cnt++] = str[i+1];

i++;

}else if(str[i]=='*'&&str[i+1]=='/'){

s[cnt++] = str[i];

s[cnt++] = str[i+1];

i++;

}

}

}

s[cnt++]='\0';

SqStack S;

InitStack(S);

bool flag = true;

for(int i=0;s[i];i++){

if(s[i]=='('||s[i]=='{'||s[i]=='[')

push(S,s[i]);

else if(s[i]=='/'&&s[i+1]=='*'){

push(S,s[i]);

push(S,s[i+1]);

i++;

}

else if(s[i]==')'){

if(!StackEmpty(S)&&GetTop(S)=='('){

pop(S,'(');

}else{

c = s[i];

flag = false;

break;

}

}

else if(s[i]==']'){

if(!StackEmpty(S)&&GetTop(S)=='['){

pop(S,'[');

}else{

c = s[i];

flag = false;

break;

}

}

else if(s[i]=='}'){

if(!StackEmpty(S)&&GetTop(S)=='{'){

pop(S,'{');

}else{

c = s[i];

flag = false;

break;

}

}

else if(s[i]=='*'&&s[i+1]=='/'){

if(!StackEmpty(S)&&GetTop(S)=='*'){

pop(S,'*');

if(!StackEmpty(S)&&GetTop(S)=='/')

pop(S,'/');

else{

c = s[i];

flag = false;

break;

}

}else{

c = s[i];

flag = false;

break;

}

i++;

}

}

if(flag&&StackEmpty(S)) printf("YES\n");

else{

printf("NO\n");

if(!StackEmpty(S)){

char x = GetTop(S);

if(x=='(')

cout<

else if(x=='[')

cout<

else if(x=='{')

cout<

else if(x=='*')

cout<

}else{

if(c==')')

cout<

else if(c==']')

cout<

else if(c=='}')

cout<

else if(c=='*')

cout<

}

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值