中易网

数据结构课程设计 表达式求解问题 求一C程序

答案:2  悬赏:50  
解决时间 2021-02-17 03:00
题目如下【问题描述】设计一个程序,求解算术表达式。【基本要求】 以字符序列的形式从键盘输入语法正确的、不含变量的整数表达式,实现对算术四则混合运算表达式的求值。如:输入9-(2+4*7)/5+3【选做内容】(1) 能够演示在求值过程中运算符栈、操作数栈、输入字符和主要操作的变化过程。
【实现提示】一般人们在书写表达式时采用的是“中缀”表达式,如:8+5*(7-3),但是这种表达式不利于计算机处理。我们可以定义后缀表达式即将运算符跟在俩个操作数后面。如:中缀:8+5*(7-3)后缀:8573-*+,若要计算该表达是只要从左向右扫描表达式,直到遇到一个运算符,然后直接取它前面的俩个操作数进行运算。如上例第一次执行7-3,表达式变为854*+,然后8 20+,在计算出结果28。这种方法比较简单。也就是说我们可以份俩步:先将中缀表达式转化为后缀表达式,再对后缀表达式进行运算。 请高手帮忙
最佳答案
呵呵 自己做吧 能学到很多东西 我以前就是自己做的 别偷懒哦
全部回答
跟你的要求符合 #include "stdio.h" #include "string.h" #include "stdlib.h" #define maxlen 100 typedef struct { char op; int level; }opt; typedef struct //定义操作符栈 { opt st[maxlen]; int top; }op_stack; typedef struct //定义值栈 { double d[maxlen]; int top; }d_stack; //--------对栈操作的定义------------- opt peek(op_stack *s) //定义看栈顶函数 { opt error=; if(s->top>=0) return s->st[s->top]; else return error; } int isempty(op_stack *s) //定义判断栈空的函数 { if(s->top<0) return 0; else return s->st[s->top].op; } char push(op_stack *s,opt c) //定义入栈函数 { s->top++; s->st[s->top]=c; return c.op; } opt pop(op_stack *s) //定义出栈函数 { opt i; opt error=; if(s->top>=0) { i=s->st[s->top]; s->st[s->top].op='\0'; s->top--; return i; } else return error; } void clear(op_stack *s) //定义初始化栈 { s->top=-1; } //-----------------------------define the value stack----------------------- double dpeek(d_stack *s) //定义看栈顶函数 { if(s->top>=0) return s->d[s->top]; else return 0; } int disempty(d_stack *s) //定义判断栈空的函数 { if(s->top<0) return 0; else return (int)(s->d[s->top]); } double dpush(d_stack *s,double c) //定义入栈函数 { s->top++; s->d[s->top]=c; return c; } double dpop(d_stack *s) //定义出栈函数 { double i; if(s->top>=0) { i=s->d[s->top]; s->d[s->top]='\0'; s->top--; return i; } else return 0; } void dclear(d_stack *s) //定义初始化栈 { s->top=-1; } double calval(char *exp) { op_stack os; //定义两个栈 d_stack ds; char tmp[maxlen]=; int i=0,leng; double dtmp,dpoptmp; opt a=; opt r=; opt m=; opt d=; opt b=; opt mo=; clear(&os); dclear(&ds); //-----定义初始化结束----- while(*exp!='\0') { while(*exp >= '0' && *exp <= '9' || *exp == '.') { while(*exp >= '0' && *exp <= '9' || *exp == '.') { tmp[i++]=*exp++; } dtmp=atof(tmp); dpush(&ds,dtmp); leng=strlen(tmp); for(i=0;i=a.level) { switch(pop(&os).op) { case '%': dpoptmp=dpop(&ds); dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp); dpush(&ds,dpoptmp); break; case '*' : dpoptmp=dpop(&ds)*dpop(&ds); dpush(&ds,dpoptmp); break; case '/' : dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)/dpoptmp; dpush(&ds,dpoptmp); break; case '+': dpoptmp=dpop(&ds)+dpop(&ds); dpush(&ds,dpoptmp); break; case '-': dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)-dpoptmp; dpush(&ds,dpoptmp); break; } } push(&os,a); *exp++; } break; case '-': if(!isempty(&os) || peek(&os).level < r.level) { push(&os,r); *exp++; } else { while(isempty(&os) && peek(&os).level>=r.level) { switch(pop(&os).op) { case '%' : dpoptmp=dpop(&ds); dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp); dpush(&ds,dpoptmp); break; case '*' : dpoptmp=dpop(&ds)*dpop(&ds); dpush(&ds,dpoptmp); break; case '/' : dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)/dpoptmp; dpush(&ds,dpoptmp); break; case '+': dpoptmp=dpop(&ds)+dpop(&ds); dpush(&ds,dpoptmp); break; case '-': dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)-dpoptmp; dpush(&ds,dpoptmp); break; } } push(&os,r); *exp++; } break; case '*': if(!isempty(&os) || peek(&os).level < m.level) { push(&os,m); *exp++; } else { while(isempty(&os) && peek(&os).level>=m.level) { switch(pop(&os).op) { case '%' : dpoptmp=dpop(&ds); dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp); dpush(&ds,dpoptmp); break; case '*' : dpoptmp=dpop(&ds)*dpop(&ds); dpush(&ds,dpoptmp); break; case '/' : dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)/dpoptmp; dpush(&ds,dpoptmp); break; } } push(&os,m); *exp++; } break; case '/': if(!isempty(&os) || peek(&os).level < d.level) { push(&os,d); *exp++; } else { while(isempty(&os) && peek(&os).level>=d.level) { switch(pop(&os).op) { case '%' : dpoptmp=dpop(&ds); dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp); dpush(&ds,dpoptmp); break; case '*' : dpoptmp=dpop(&ds)*dpop(&ds); dpush(&ds,dpoptmp); break; case '/' : dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)/dpoptmp; dpush(&ds,dpoptmp); break; } } push(&os,d); *exp++; } break; case '%': if(!isempty(&os) || peek(&os).level < mo.level) { push(&os,mo); *exp++; } else { while(isempty(&os) && peek(&os).level>=mo.level) { switch(pop(&os).op) { case '%' : dpoptmp=dpop(&ds); dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp); dpush(&ds,dpoptmp); break; case '*' : dpoptmp=dpop(&ds)*dpop(&ds); dpush(&ds,dpoptmp); break; case '/' : dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)/dpoptmp; dpush(&ds,dpoptmp); break; } } push(&os,mo); *exp++; } break; case '(': push(&os,b); exp++; break; case ')': while(peek(&os).level!=-2) { switch(pop(&os).op) { case '%' : dpoptmp=dpop(&ds); dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp); dpush(&ds,dpoptmp); break; case '*' : dpoptmp=dpop(&ds)*dpop(&ds); dpush(&ds,dpoptmp); break; case '/' : dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)/dpoptmp; dpush(&ds,dpoptmp); break; case '+': dpoptmp=dpop(&ds)+dpop(&ds); dpush(&ds,dpoptmp); break; case '-': dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)-dpoptmp; dpush(&ds,dpoptmp); break; } } pop(&os); //弹出 ( exp++; break; } } while(isempty(&os)) { switch(pop(&os).op) { case '%' : dpoptmp=dpop(&ds); dpoptmp=(float)((int)dpop(&ds)%(int)dpoptmp); dpush(&ds,dpoptmp); break; case '*' : dpoptmp=dpop(&ds)*dpop(&ds); dpush(&ds,dpoptmp); break; case '/' : dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)/dpoptmp; dpush(&ds,dpoptmp); break; case '+': dpoptmp=dpop(&ds)+dpop(&ds); dpush(&ds,dpoptmp); break; case '-': dpoptmp=dpop(&ds); dpoptmp=dpop(&ds)-dpoptmp; dpush(&ds,dpoptmp); break; } } return dpop(&ds); } void main() { char string[maxlen]; char *p=string; printf("输入表达式:\n"); gets(p); printf("%s=%f\n\n",string,calval(p)); }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
陵县新四通驾校滋镇报名处在哪里啊,我有事要
丰台区蓝天怡景小区邮编
关于水浒传潘金莲的...
我跟我一朋友一起学车 她比我先学完了 她刚才
室内液晶屏大屏幕为什么选择液晶拼接大屏幕
祁连山街/流花湖路(路口)地址在哪,我要去那
生活服务技师是什么?
exo growl完整版中文歌词
蚩尤怎么的拼音
艺凡居家装饰怎么去啊,有知道地址的么
手机4200毫安的电池,待机状态下怎么耗电很快
转笔的Tan怎么读?
汽车前轮气压正常,且前轴承也正常,为什么常
日文片畦什麼意思
外贸服装针织内衣批发中心在哪里啊,我有事要
推荐资讯
庆元香菇238品种是那家陪育的
如何破解数据库?
虎皮扣肉的做法步骤图,虎皮扣肉怎么做好吃
鑫聚通食品物流配送有限公司(溪湖东路111-22
新疆医科大学和内蒙古医学院及昆明医学院相比
有什么软件可以同时设置多个邮箱接收信息?
奇迹暖暖中的服装收集度指哪些服装
香依在哪里啊,我有事要去这个地方
张智芃茗字打分2015.3.9号下午16:3出生起这
安信易贷地址在哪,我要去那里办事
聚成教育(清远连州市)地址在什么地方,想过去
INTJ男如何谈恋爱
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?