算术表达式求值(C语言)

#include<stdlib.h> #include <stdio.h> #include <malloc.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; }sqstack;//顺序栈 char a[7][7]={ {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','/0'}, {'>','>','>','>','/0','>','>'}, {'<','<','<','<','<','/0','='} }; // '+', '-', '*', '/','(', ')', '#'之间的优先级矩阵 void initStack(sqstack *s) { s->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!s->base) {printf("OVERFLOW!/n");return;} s->top=s->base; s->stacksize=STACK_INIT_SIZE; } char getTop(sqstack *s) { int e; SElemType *p; p=s->top; if(s->base==s->top) {printf("EmptyStack!/n");return 0;} e=*(--p); return e; } void push(sqstack *s,int e) { if(s->top-s->base>=s->stacksize) { s->base=(SElemType *)realloc(s->base, (s->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!s->base) {printf("OVERFLOW!/n");return;} s->top=s->base+s->stacksize; s->stacksize+=STACKINCREMENT; } *s->top++=e; } void pop(sqstack *s,int *e) { if(s->base==s->top) {printf("EmptyStack!/n");return;} *e=*(--s->top); } void printStack(sqstack *s) { SElemType *p; p=s->top; if(!s->base) {printf("EmptyStack!/n");return;} printf("stack:"); while(p!=s->base) { printf("%d",*(--p)); } } int in(char c) { switch(c) { case '+': case '-': case '*': case '/': case '(': case ')': case '#': return 1; default: return 0; } } int sswitch(char x) { int m; switch(x) { case '+': m=0;break; case '-': m=1;break; case '*': m=2;break; case '/': m=3;break; case '(': m=4;break; case ')': m=5;break; case '#': m=6;break; } return m; } //判断符号x,y的优先级 char precede(char x,char y) { int i,j; i=sswitch(x); j=sswitch(y); return a[i][j]; } //计算a theta a表达式的值 int operate(int a,char theta,int b) { int m; switch(theta) { case '+': m=a+b;break; case '-': m=a-b;break; case '*': m=a*b;break; case '/': m=a/b;break; } return m; } /*表达式求值主函数*/ int evaluateExpression() { char c; int i,num; int x; char d[20]; char theta; int a,b; sqstack optr; sqstack opnd; initStack(&optr); initStack(&opnd); push(&optr,'#'); printf("请输入表达式求值,并以 # 结尾:/n"); c=getchar(); while(c!='#'||getTop(&optr)!='#') { if(!in(c)) { if(c>='0'&&c<='9') //读取一个数字串 { i=0; do { d[i++]=c; c=getchar(); }while(c>='0'&&c<='9'); d[i]='/0'; num=atoi(d);//将数字串转换为数字 push(&opnd, num); } } else//如果是运算符,则判断其与optr栈顶的优先级 switch(precede(getTop(&optr),c)) { case '<': push(&optr,(int)c); c=getchar(); break; case '='://优先级相等,脱去括号,接受下一个字符 pop(&optr,&x);c=getchar(); break; case '>'://优先级大,进行运算,并把结果压入opnd中 pop(&optr,(int*)&theta); pop(&opnd,&b); pop(&opnd,&a); push(&opnd,operate(a,theta,b)); break; } } return getTop(&opnd); } void main() { int e; while(1) { printf("********************表达式求值程序**********************/n"); printf("** xxm524 **/n"); printf("***********************11-3-31************************/n/n"); e=evaluateExpression(); printf("表达式结果:"); printf("%d/n/n",e); } getchar(); getchar(); }

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一马途追

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值