#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
getline(cin,str);
int len=str.size();
//统计左右括号数
int cntL,cntR;
cntL=cntR=0;
for(int i=0;i<len;i++)
{
if(str[i]=='(')
cntL++;
if(str[i]==')')
cntR++;
}
/*
情况1:左右括号数目不等,如if(a(b),if(abc, if abc)
情况2:左右括号数均为0,如if abc
打印错误信息,退出
*/
if((cntL!=cntR) ||(cntL==0))
{
cout<<"WRONG "<<cntL<<" "<<cntR<<endl;
return 0;
}
//情况3:左右括号匹配错误,如if((a)b)c(d)
//情况4:最外层不是一对括号,如if(a)(b)
int k=0; //堆栈计数器,k=0表示栈空;入栈k++,出栈k--
int popK=0; //出栈计数器,用于判断出栈至空时,是否右括号已经计完
//如果空栈情况下,还遇到出栈的情况,说明此时右括号先出现不匹配;
//如果还未到最后一个右括号,栈已空,说明不满足“最外层至少一对括号”的情况
for(int i=0;i<len;i++)
{
if(str[i]=='(') //遇到左括号,入栈,即k++
{
k++;
}
if(str[i]==')') //遇到右括号,出栈
{
if(k==0) //如果出栈是,栈已空,说明右括号早于左括号出现,不匹配,打印错误信息并退出
{
cout<<"WRONG "<<cntL<<" "<<cntR;
return 0;
}
k--; //如果不符合上述情况,则出栈;不必用else
popK++; //出栈计数器递增
if(k==0) //如果出栈后,导致栈空,则判断出栈计数器是否等于右括号总数
{
if(popK<cntR) //如果出栈计数器小于右括号总数,说明不满足“”最外层至少一对括号”的情况,打印错误信息并退出
{
cout<<"WRONG "<<cntL<<" "<<cntR<<endl;
return 0;
}
}
}
}
cout<<"RIGHT "<<cntL<<" "<<cntR;
return 0;
}
华为机试——括号匹配
最新推荐文章于 2024-09-28 22:33:29 发布