递归下降 方法 1126 3295

本文介绍了如何使用递归下降解析器解决两类字符串分析问题。第一类问题关注于检查字符串的有效性;第二类则涉及判断逻辑命题的恒真性。通过具体的C++代码示例,展示了如何针对不同字符构建解析规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.pku.edu.cn/JudgeOnline/problem?id=1126

http://acm.pku.edu.cn/JudgeOnline/problem?id=3295

 

两道题目很相似,都是对一个字符串进行分析,并得出结果,核心思想使用递归下降的方法

 code 1126

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int j(0);
  5. string temp;
  6. int check();
  7. int main()
  8. {
  9.  freopen("in.txt","r",stdin);
  10.  int f;
  11.  while(cin>>temp)
  12.  {
  13.   f=check();
  14.   if(j<temp.size ())//如果调用完后,j<temp.size() 那么就为错
  15.    f=0;
  16.   j=0;
  17.   if(f)
  18.    cout<<"YES"<<endl;
  19.   else
  20.    cout<<"NO"<<endl;
  21.   
  22.  }
  23.  return 0;
  24. }
  25. int check()
  26. {
  27.  int ch=temp[j++];
  28.  switch(ch)
  29.  {
  30.  case 'p':case 'q':case 'r':case 's':case 't':case 'u':case 'v':case 'w':case 'x':case 'y':case 'z':return 1;break;
  31.  case 'I':case  'E':case 'D':case 'C':return check()&check();break;
  32.  case 'N':return check();break;
  33.  default:return 0;
  34.  }
  35. }

code 3295

  1. #include<iostream>
  2. using namespace std;
  3. int check() ;
  4. int j(0);
  5. char temp[201];
  6. short v[200]={0};
  7. int main()
  8. {
  9.     freopen("in.txt","r",stdin);
  10.      int p,q,r,s,t,f(1);
  11.     while(cin>>temp&&temp[0]!='0')
  12.     {
  13.         f=1;
  14.         j=0;
  15. //对32 种情况的枚举
  16.         for( p=0; p<=1&&f; p++)
  17.             for( q=0; q<=1&&f; q++)
  18.                 for(r=0; r<=1&&f; r++)
  19.                     for(s=0; s<=1&&f; s++)
  20.                         for( t=0; t<=1&&f; t++)
  21.                         {
  22.                             v['p'-'0']=p;
  23.                             v['q'-'0']=q;
  24.                             v['r'-'0']=r;
  25.                             v['s'-'0']=s;
  26.                             v['t'-'0']=t;
  27.                             j=0;
  28.                                 f=check();
  29.                                 if(f==0)
  30.                                 {
  31.                                     cout<<"not"<<endl;
  32.                                     break;
  33.                                 }
  34.                         
  35.                         }
  36.                         if(f)
  37.                             cout<<"tautology"<<endl;
  38.     }
  39.     return 0;
  40. }
  41. int check() { 
  42.     int ch=temp[j++];
  43.     switch(ch) { 
  44.         case 'p':case 'q':case 'r':case 's'case 't':return v[ch-'0']; break;
  45.         case 'K'return check() & check(); break;
  46.         case 'A'return check() | check(); break;
  47.         case 'N'return !check();break;
  48.         case 'C'return !check()|check();break;
  49.         case 'E':return  !check() ^ check(); break;
  50.     } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值