正文

表达式检验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)yespress Ctrl+c to exit !()nopress Ctrl+c to exit !3+4-(3*3)yespress Ctrl+c to exit !8((nopress Ctrl+c to exit !8()nopress Ctrl+c to exit !3=3nopress 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;}  

阅读(3300) | 评论(0)


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

评论

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