永发信息网

表达式求值程序大家帮我修改一下

答案:1  悬赏:10  手机版
解决时间 2021-04-25 21:30

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"math.h"
#define MAX 100
#define ADD 10
enum status{ok,fail};
//操作数
typedef struct{
int *base;
int *top;
int stacksize;
}opndstack;
//操作符
typedef struct{
char *base;
char *top;
int stacksize;
}optrstack;
//初始化操作数
enum status Initopndstack(opndstack *S){
(*S).base=(int *)malloc(MAX*sizeof(int));
if(!S->base) return fail;
S->top=S->base;
S->top=0;
S->top++;
S->stacksize=MAX;
return ok;
}
//初始操作符
enum status Initoptrstack(optrstack *S){
(*S).base=(char *)malloc(MAX*sizeof(char));
if(!S->base) return fail;
S->top=S->base;
*(S->base)='#';
S->top++;
S->stacksize=MAX;
return ok;
}
//压入操作数
enum status push1(opndstack *S,int e){
if(S->top-S->base>=MAX) {
S->base=(int *)realloc(S->base,MAX*sizeof(int));
if(!S->base) return fail;
S->top=S->base+S->stacksize;
S->stacksize+=ADD;
}
*(S->top)++=e;
return ok;
}
//取栈顶元素用e返回其值,并删除 操作数
enum status pop1(opndstack *S,int *e){
if(S->base==S->top) return fail;
*e=*--S->top;
return ok;
}
//压入操作符
enum status push2(optrstack *S,char e){
if(S->top-S->base>=MAX) {
S->base=(char *)realloc(S->base,MAX*sizeof(char));
if(!S->base) return fail;
S->top=S->base+S->stacksize;
S->stacksize+=ADD;
}
*S->top++=e;
return ok;
}
//取栈顶元素用e返回其值,并删除 操作符
enum status pop2(optrstack *S,char *e){
if(S->base==S->top) return fail;
*e=*--S->top;
return ok;
}
//取栈顶操作符 不删除
enum status gettop(optrstack S,char *e){
if(S.base==S.top) return fail;
*e=*(S.top-1);
return ok;
}
//操作符优先权的比较
char precede(char e3,char e2){
switch(e3){
case '+':if(e2=='+'||e2=='-'||e2==')') return '>';else return '<';break;
case '-':if(e2=='+'||e2=='-'||e2==')') return '>';else return '<';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':if(e2==')') return '=';else return '<';break;
}
}
//计算函数
int operate(int x1,int x2,char y2){
int k;
switch(y2){
case'+':k=x2+x1;break;
case'-':k=x2-x1;break;
case'*':k=x1*x2;break;
case'/':k=x2/x1;break;
}
return k;
}
void main(){
opndstack S1;optrstack S2;enum status m1,m2;int e1,x1,x2;char e2,e3,y1,y2;
m1=Initopndstack(&S1);
m2=Initoptrstack(&S2);
if(m1==fail||m2==fail) {printf("not succeceful to creat the stack\n"); getchar(); exit(0);}
printf("请输入表达式\n");
e2=getchar();
// if(e2!='='||e2!='+'||e2!='-'||e2!='*'||e2!='/'||e2!='('||e2!')') e2=(int)e2;
while(e2!='='){
scanf("%d",&e1);
push1(&S1,e1);
scanf("%c",&e2);
if(e2=='=') break;
gettop(S2,&e3);
switch(precede(e3,e2)){
case'<':
push2(&S2,e2);break;
case'=':
pop2(&S2,&y1);break;
case'>':
pop2(&S2,&y2);
pop1(&S1,&x1);pop1(&S1,&x2);
push1(&S1,operate(x1,x2,y2));break;
}
}
pop1(&S1,&x2);
printf("%d",x2);
getchar();
}


最佳答案
这个程序太烂了,没法改啊,重新写一个行不?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
此题在新西兰面试的时候曾引起巨大反响.有谁
求九年级 金榜学案 数学 浙教版 答案
中学生男女开房会有啥后果
高级驾照难么?、
速度大小的改变量与速度改变量大小的 区别
月明茶苑这个地址在什么地方,我要处理点事
怎么样才能把QQ花藤弄到主页
做什么方面的维修,比较好
晕车特利害,难过死了,类似情况怎么处理?总
DNF的刺客刷图时技能怎么用才能“以最小的代
我的手机QQ不能打字啊怎么办啊啊啊啊啊?
MP4掉水了能修好吗?有知道的请说下。
牧场月兔如何获得?
火影佩恩是怎么通灵六道的
怀孕体质指数多少正常,基本公共卫生服务体质
推荐资讯
红桥内边PSP2000破解版16G价格在多少?
我有病你有药吗歌词,这首歌词:我想我会爱你
谁能给我一个qq爱墙的种子啊?
苏州高新区疾病预防控制中心地址在哪,我要去
谁有彩虹岛缘分天空的爱琴海号?
请问应该相信谁?
谁有可以下txt电子书的小说网?
We can see a beautiful girl t___the window
被亲人朋友伤害的句子,亲人伤害自己的句子
索爱W980好用不???
请问什么叫做非全日制用工,什么叫做全日制用
求主角是那种渡劫失败,或者是意处死亡的重生
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?