思路
括号匹配要求从内而外,也就符合栈的后进先出的思想,没必要用两个栈去处理,既然是匹配,就可以用括号匹配要求从内而外,也就符合栈的后进先出的思想,没必要用两个栈去处理,既然是匹配,就可以用分而治之的思想处理,不妨用一个栈存左括号,当左括号后面不是左括号时,它必须是与之匹配的右括号,这时就可以出栈。当后面依旧是右括号时,就重复上面的操作。
代码实现
#include <iostream>
#include <cstring>
using namespace std;
int flag=0;
struct node
{
char date;
node *next;
};
struct likestack
{
node *top;
int counter;
};
void initstack(likestack *S)
{
S->top->next=NULL;
S->top->date='o';
S->counter=0;
}
bool push(likestack *S,char c)
{
node *p=new node;
p->date=c;
p->next=S->top;
S->top=p;
S->counter++;
return true;
}
bool pop(likestack *S)
{
node *p;
if(S->counter==-1)
{
return false;
}
p=S->top;
S->top=S->top->next;
delete p;
S->counter--;
return true;
}
void likestackempty(likestack *S)
{
if(S->counter==-1)
{
flag=1;
}
}
int main()
{
char c;
likestack *S=new likestack;
S->top=new node;//注意c++自己的事自己做的思想
initstack(S);
while(1)
{
cin>>c;
if(flag==1)
{
cout<<0;
return 0;
}
switch(c)
{
case '#':
if(S->counter==-1)//最后应该是左右括号全都抵消
cout<<1;
else
cout<<0;
return 0;
break;
case '{':
case '(':
case '[':
push(S,c);
break;//遇到左括号就一律入栈
case '}':
likestackempty(S);//判断左括号栈是否为空
if(S->top->date!='{')//判断括号是否匹配
flag=1;
else
pop(S);
break;
case ')':
likestackempty(S);
if(S->top->date!='(')
flag=1;
else
pop(S);
break;
case ']':
likestackempty(S);
if(S->top->date!='[')
flag=1;
else
pop(S);
break;
}
}
return 0;
}