离散数学判断合法公式

问题遇到的现象和发生背景

以下代码有什么可以改进的地方,有什么bug吗?

问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
#include <iostream>

#include"string.h"
using namespace std;
void rule1(char a[],int i)
{
    if((a[i]>='a')&&(a[i]<='z'))
    {
        a[i]='1';
    }
    else if(a[i]=='0')
        a[i]='1';
}
int rule2(char a[],int i)
{
    int n=strlen(a);
    int _result=0;
    if((i+1<n)&&(a[i]=='!')&&(a[i+1]=='1'))
    {a[i]='1';
    i++;
    while(a[i+1]!='\0')
    {
        a[i]=a[i+1];
        i++;
    }
    a[i]='\0';
    _result=1;

    }
    else if((i+2<n)&&(a[i]=='(')&&(a[i+1]=='1')&&(a[i+2]==')'))
    {
        a[i]='1';
        i++;
        while(a[i+2]!='\0')
        {
            a[i]=a[i+2];
            i++;

        }
        a[i]='\0';
        _result=1;
    }
    return _result;

}
int rule3(char a[],int i)
{int _result=0;

    int n=strlen(a);
    if((i+2<n)&&(a[i]=='1')&&((a[i+1]=='+')||(a[i+1]=='*')||(a[i+1]=='-')||(a[i+1]=='='))&&(a[i+2]=='1'))
    {
        a[i]='1';
        i++;
        while(a[i+2]!='\0')
        {
            a[i]=a[i+2];
            i++;
        }
        a[i]='\0';
 _result=1;
    }

        return _result;
}
int main()
{
   char pstate[120],pstate0[120];
   int i=0,nold=0,nnew=0;
   printf("请输入公式(析+,合*,条-,双=,否!,01):\n");
   gets(pstate0);
   fflush(stdin);
   nold=strlen(pstate0)+1;
   nnew=strlen(pstate0);
   for(i=0;i<nnew;i++)
   {
       pstate[i]=pstate0[i];
   }
   pstate[i]='\0';i=0;
   while(i<strlen(pstate)){
    rule1(pstate,i);
    i++;
   }
   nold=strlen(pstate0)+1;
   nnew=strlen(pstate);
   while(nnew<nold){
    nold=strlen(pstate);
    i=0;
    while(i<strlen(pstate))
    {
        if(rule2(pstate,i)==0)
            i++;
    }
   i=0;
   while(i<strlen(pstate)){
    if(rule3(pstate,i)==0)
        i++;
   }

   }
   if((pstate[0]=='1')&&(strlen(pstate)==1))
    printf("%s is valid\n",pstate0);
   else{
        printf("%s is invalid\n",pstate0);}
    return 0;
}