正文

表达式检验2007-03-20 11:16:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/24124.html

分享到:

/***********************************************************************************\
 功    能:    检验含括号的四则运算表达式的合法性  
 输入说明:    按提示输入表达式 ctrl+c 结束输入          

 输出说明:   如果表达式合法则输出 yes ,否则输出 no       
 
测试数据如下:
    
press Ctrl+c to exit !
(((3+4*3+(333+4)+(33*34))/3)+4)
yes
press Ctrl+c to exit !
()
no
press Ctrl+c to exit !
3+4-(3*3)
yes
press Ctrl+c to exit !
8((
no
press Ctrl+c to exit !
8()
no
press Ctrl+c to exit !
3=3
no
press Ctrl+c to exit !
 
 算法说明: 象拨竹笋一样从最内层括号开始,注意将括号改为数字不改变表达式的合法性
               寻找最内层括号:找表达式最左的')' ,找表达式最右并且在前面所找')'左边
               的'('这对括号就是最内层括号,检验这两个位置的前后是否合法,例如对 '('
               之前不能有数字,之后不能有运算符,检验完后将它们改为数字。
               处理完括号就处理运算符,方法和括号的差不多。
   
 语    言:    非标准 C  编译环境:       VC ++ 6.0            
 Author  :   江南孤峰                     Time :2006--11--29    

 独学而无友,则孤陋而寡闻  编程爱好者群 : 28011342       
\************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <ctype.h>

#define MAX 100

char* GetFirst(char *p){
 /* 找表达式 p 中的运算符 ,返回找到的位置 */
 char *f;
 
 if((f = strchr(p,'+')))
  return f;
 if((f = strchr(p,'-')))
  return f;
 if((f = strchr(p,'*')))
  return f;
 if((f = strchr(p,'/')))
  return f;
 return NULL;
}

int Deny(char *pstr,int len){
 /* 测试表达式的合法性,是则返回 1,否则返回 0 */
 int i = 0;
 char *stack[MAX],*p,*a,*b,*c;
 
 if(strchr("+-*/)",*pstr))
  return 0; /* 首位置的合法性检验 */
 p = (char*)malloc(len);
 strcpy(p,pstr);  /* 避免改变原表达式 */
 for(i = 0; i < len; i ++){ /* 表达式字符合法性检查 */
  if(!isdigit(*(p+i)) && !strchr("+-*/()",*(p+i)))
   return 0;
 }
 while(1){ /* 括号处理 */
  a = strchr(p,')');
  if(!a && strchr(p,'('))
   return 0;
  for(i = 0,c = b = strrchr(p,'('); b && b > a;i ++){
   stack[i] = c;
   *c = '1';
   c = b = strrchr(p,'(');
  }
  if(!a && !b)
   break;
  for(i --;i >= 0; i --)
   *stack[i] = '(';
  if((!a && b) || (a && !b))
   return 0;
  else{ /* 括号左右字符合法性检验 */
   if(!isdigit(*(a-1)) || !isdigit(*(b+1)))
    return 0;
   if(a != (p+len-1)){
    if(!(strchr("+-*/)",*(a+1))))
     return 0;
   }
   if(b != p){
    if(!strchr("+-*/(",*(b-1)))
     return 0;
   }
   /* 将括号改为数字 */
   *a = '1';
   *b = '1';
  }
 }
 while(1){/* 运算符左右字符合法性检验 */
  if(!(a = GetFirst(p)))
   break;
  if(!(isdigit(*(a-1))))
   return 0;
  if(!(isdigit(*(a+1))))
   return 0;
  *a = '1';
 }
 return 1;
}

int main(){
 char array[100];
 
 while(1){
  puts("press Ctrl+c to exit !");
  gets(array);
  if(Deny(array,strlen(array)))
   printf("yes\n");
  else
   printf("no\n");
 }
 return 0;
}

 

阅读(3130) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册