您的位置:首页 > 其它

使用纯递归判断括号是否匹配

2015-08-10 12:53 381 查看
判断括号大家可能都会,无非就是进栈出栈的问题,但是我们一般都会显式的定义一个栈,一般就是一个数组,现在有一个问题,要求不能使用显示栈,不能用数组,甚至不能用指针,当然也不能用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  括号匹配 纯递归