可以考虑利用堆栈来做,遍历整个输入字符将左括号全部入栈,出现右括号就出栈。其正确的情况下首先左右括号数量必须保持一致,其次在最后一个右括号出现前栈里是不能为空的!这就可以分为当出现右括号要出栈时栈里却是空的这肯定不匹配,再者当前为右括号时出栈后栈为空时出栈数小于总括号数就肯定也是不匹配的。因此不匹配的情况分为三种:
1.左右括号数量不一致;
2.当出现右括号要出栈时栈里却是空的;
3.当前为右括号时出栈后栈为空时出栈数小于总括号数
以下时完整代码:
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
struct Cstack
{
char data[30];
int top;
};
BOOL Push(Cstack*s,char* e)
{
if (s->top==19)
return FALSE;
s->top++;
s->data[s->top]=*e;
return TRUE;
}
BOOL Pop(Cstack*s)
{
if (s->top!=-1)
{
s->top--;
return TRUE;
}
else
return FALSE;
}
void InitStack(Cstack*s)
{
s->top=-1;
for (int i=0;i<30;i++)
s->data[i]='\0';
}
int main()
{
string s;
getline(cin,s);
Cstack stk;
InitStack(&stk);
int left=0,right=0,StakNum=0;
for (int i=0;i<s.size();i++)
{
if (s.at(i)=='(')
left++;
if (s.at(i)==')')
right++;
}
if (left!=right)
{
cout<<"左右括号不相等,不匹配!"<<endl;
Sleep(1000000);
return 0;
}
else
{
for (int j=0;j<s.size();j++)
{
if (s.at(j)=='(')
Push(&stk,&s.at(j));
if (s.at(j)==')')
{
if (stk.top==-1)
{
cout<<"左右括号不匹配!"<<endl;
Sleep(1000000);
return 0;
}
else
{
Pop(&stk);
StakNum++;
if ((stk.top==-1)&&(StakNum<right))
{
cout<<"左右括号不匹配!"<<endl;
Sleep(1000000);
return 0;
}
}
}
}
}
cout<<"左右括号匹配成功!"<<endl;
Sleep(1000000);
}