题目
请编写程序检查C语言源程序中下列符号是否配对:/* 与 */、( 与 )、[ 与 ]、{ 与 }。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出,否则输出。然后在第二行中指出第一个不配对的符号(注意点):如果缺少左符号,则输出;如果缺少右符号,则输出。
输入样例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
题解:
- 分析
题意分析: 配对具有轴对称性质的符号,{},[],(),/*/*/,首先要先出现左符号,再出现右符号,完成配对,但/**/与其他符号不同的是,它是四个字符,所以后续操作我们遇到/* 将其理解为为<,*/理解为>,这样就统一判断条件。
存储方式上分析: 出现一个左符号,存储起来,等待出现的右符号,出现,则离开存储器,典型后进先出,所以采用栈存储,这里不再自定义栈来,而是调用C++库中的stack类完成。出现左符号,压入栈中,出现对应的右符号,栈顶出栈。所以栈中只会存在左符号。
判断条件分析:
(1).出现左符号,压入栈
(2).出现右符号。
- 栈为空。直接输出?—当前右符号,且程序终止。
- 栈不为空。
* a. 栈顶为对应左符号,栈顶出栈。
* b. 栈顶为不是对应左符号,直接输出栈顶左符号—?,终止程序。(注意点)
输入处理:输入字符串,转成字符数组,以空格和回车分割,转换后一次处理一个字符串,即一个字符数组。
代码实现:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
stack<char> stk;
char tmp[] = {')','}',']'};
void output(char ch){
if(ch=='<'){
cout<<"NO\n/*-?"<<endl;
}else {
cout<<"NO\n"<<ch<<"-?"<<endl;
}
}
bool match(char *c,int len){
int i=-1;
int j=0;
while(++i<len){
if(c[i]=='/'){
if(stk.empty()) if(c[i+1]!='*') continue;
if(c[i+1]=='*'){
stk.push('<');
++i;
}else if(stk.top()=='<'&&c[i+1]!='*'){
cout<<"NO\n/*-?"<<endl;
return 0;
}
}else if(c[i]=='*'){
if(stk.empty()){
if(c[i+1]!='/') continue;
else{
cout<<"NO\n?-*/"<<endl;
return 0;
}
}
if(stk.top()=='<'&&c[i+1]=='/') {
stk.pop();
++i;
}else if(stk.top()!='<'&&c[i+1]=='/'){
output(stk.top());
return 0;
}
}else if(c[i]=='('||c[i]=='{'||c[i]=='['){
stk.push(c[i]);
}else if(c[i]==')'||c[i]=='}'||c[i]==']' ){
if(stk.empty()){
if(c[i]=='}') j=1;
else if(c[i]==']') j=2;
}else {
if(c[i]==')'){
if(stk.top()=='('){
stk.pop();
continue;
}else {
output(stk.top());
return 0;
}
}else if(c[i]=='}'){
if(stk.top()=='{'){
stk.pop();
continue;
}else{
output(stk.top());
return 0;
}
}else{
if(stk.top()=='['){
stk.pop();
continue;
}else{
output(stk.top());
return 0;
}
}
}
cout<<"NO\n?-"<<tmp[j]<<endl;
return 0;
}
}
return 1;
}
int main(){
string str;
while(cin>>str){
char *c = (char*)str.data();
if(c[0]=='.'&&c[1]==0)break;
if(!match(c,str.length())){
return 0;
}
}
if(stk.empty()){
cout<<"YES"<<endl;
}else{
if(stk.top()=='<') cout<<"NO\n/*-?"<<endl;
else cout<<"NO\n"<<stk.top()<<"-?"<<endl;
}
return 0;
}
代码采用c++,经过测试暂无问题,如有问题,请及时联系本人。