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

判断括号大家可能都会,无非就是进栈出栈的问题,但是我们一般都会显式的定义一个栈,一般就是一个数组,现在有一个问题,要求不能使用显示栈,不能用数组,甚至不能用指针,当然也不能用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;
}
    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/wr132/article/details/47397031
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞