判断括号大家可能都会,无非就是进栈出栈的问题,但是我们一般都会显式的定义一个栈,一般就是一个数组,现在有一个问题,要求不能使用显示栈,不能用数组,甚至不能用指针,当然也不能用stl,就使用纯递归,而且包含三种括号,怎么做呢?
这里,我提供一种思路:
1.既然是递归,无非也就是栈,这里,我们将第一层做个标记#,表示这是一个接受层
2.在之后的每一层,首先用getchar()输入一个字符,然后与上一层的输入做比较,如果不匹配,继续输入,如果匹配,不仅要退出本层递归,还要退出上层递归。
3.如果输入的数据为回车,那么只需要判断上一层的符号,如果是#,说明全部匹配成功,否则就失败了。
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const double PI=4.0*atan(1.0);
void judge(char pre)
{
static int flag;//如果遇到匹配项,需要跳出两层递归,以此来标记
static char now;//最后输入的符号,必须保证每一层递归都可见
char c;//当前输入的符号
if(pre=='S')//第一次出现在第一层的时候,初始化变量
{
flag=0;
c='#';
}
//cout<<"flag:"<<flag<<endl;
if(pre!='S')//第一层不输入,因为这是一个接受标记层
{
c=getchar();
now=c;
}
if((c==')'&&pre=='(')||(c==']'&&pre=='[')||(c=='}'&&pre=='{'))//如果能匹配
{
flag=1;//设置标志位
//cout<<"pipei"<<endl;
return;//退栈
}
while(1)
{
if(now=='\n')//如果最后的输入符号是回车,说明输入结束
{
if(pre!='#')//如果上一层不是接受层
cout<<"no"<<endl;
else//上一层是接受层
cout<<"yes"<<endl;
exit(0);
}
judge(c);//进入下一层
if(flag==1)//如果由下一层退回本层,判断flag
{
flag=0;//设置flag
return;//再退一层
}
}
//if(pre=='#')
//cout<<"yes"<<endl;
}
int main()
{
//printf("%.100lf",PI);
judge('S');
return 0;
}