PTA 符号配对

题目

请编写程序检查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<iostream>
#include<stack>
#include<string>
using namespace std;
int main(){
	stack<string> ip;
	string str;
	while(1){
		getline(cin,str);
		if(str[0] == '.') break;
		for(int i = 0;str[i]!='\0';++i){
			if(str[i]=='{') ip.push("{");//左符号压栈
			else if(str[i]=='[') ip.push("[");
			else if(str[i]=='(') ip.push("(");
			else if(str[i]=='/' && str[++i] == '*') ip.push("/*");
			else if(str[i]=='*'&& str[++i] == '/'){
					if(!ip.empty()&&ip.top()=="/*") ip.pop();//右符号匹配则出栈
					else{
						if(ip.empty()) cout <<"NO"<<endl<<"?-*/"<<endl;//栈空,左符号不匹配
					 	else cout << "NO"<<endl<<ip.top()<<"-?"<<endl;//栈不空,右符号不匹配
					 	return 0;
					}
			}
			else if(str[i]==')'){
					if(!ip.empty()&&ip.top()=="(") ip.pop();
					else{
						if(ip.empty()) cout << "NO"<<endl<<"?-)"<<endl;
						else cout <<"NO"<<endl<<ip.top()<<"-?"<<endl;
						return 0;
					}
			}
			else if(str[i]==']'){
					if(!ip.empty()&&ip.top()=="[") ip.pop();
					else{
						if(ip.empty()) cout << "NO"<<endl<<"?-]"<<endl;
						else cout <<"NO"<<endl<<ip.top()<<"-?"<<endl;
						return 0;
					}
			}
			else if(str[i]=='}'){
					if(!ip.empty()&&ip.top()=="{") ip.pop();
					else{
						if(ip.empty()) cout << "NO"<<endl<<"?-}"<<endl;
						else cout <<"NO"<<endl<<ip.top()<<"-?"<<endl;
						return 0;
					}
			}
		}
	}
	if(ip.empty()) cout <<"YES"<<endl;//所有符号均匹配
	else cout << "NO"<<endl<<ip.top()<<"-?"<<endl;//剩余左符号未匹配
	return 0;
}

运行结果

在这里插入图片描述

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

registor11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值