华为机试——括号匹配

来源:互联网 发布:暴雪 知乎 编辑:程序博客网 时间:2024/06/08 11:10
#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;}
0 0
原创粉丝点击