使用纯递归判断括号是否匹配
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;
}
这里,我提供一种思路:
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;
}
相关文章推荐
- python正则表达式中的括号匹配问题
- 括号匹配问题
- 打印括号匹配的所有排列
- if语句中的括号匹配检测
- Parentheses Balance——括号匹配
- 愚人节的礼物
- 伪代码:括号匹配
- [栈和队列]括号匹配
- 括号匹配算法的C++代码实现
- C++STL库栈算法的括号匹配
- 检验某符号(如圆括号,方括号,花括号等)是否都成对出现
- (C++)数据结构之括号匹配的问题?
- 括号匹配
- LeetCode 20 - Valid Parentheses
- 括号匹配问题,用栈实现
- LeetCode——Valid Parentheses
- LeetCode——Generate Parentheses
- 看数据结构写代码(11)栈的应用(二) 括号匹配的检查
- NYOJ 15 括号匹配(二) dp
- toj1242 Parencodings