#include<stdio.h>
#include<malloc.h>
#define size 100
#define crement 10
#include <stdlib.h>
#define overflow -2
#define ok 1
#define error 0
typedef struct{
int *base;
int *top;
int stacksize;
}sqstack;
char Proceed(char op,char c)
{
char ch;
if(op=='(' && c==')' || op=='#' && c=='#' )
ch = '=';
else
if(op=='+' || op=='-')
switch(c)
{
case '+':
case '-':
case ')':
case '#': ch = '>'; break;
case '*':
case '/':
case '(': ch = '<';
}
else
if(op=='*' || op=='/')
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case ')':
case '#': ch = '>'; break;
case '(': ch = '<';
}
else
if(op=='(')
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(': ch = '<'; break;
case '#': printf("Error!\n"); exit(0);
}
else
if(op==')')
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '#': ch = '>'; break;
case '(': printf("Error!\n"); exit(0);
}
else
if(op=='#')
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(': ch = '<'; break;
case ')': printf("Error!\n"); exit(0);
}
return ch;
}
void initstack(sqstack &s){
s.base=(int *)malloc(size*sizeof(int));
if(!s.base) exit (overflow);
s.top=s.base;
s.stacksize=size;
}
int gettop(sqstack s){
int e;
if(s.top==s.base) return error;
e=*(s.top-1);
return (e);
}
int push(sqstack &s,int e){
if(s.top-s.base>=s.stacksize){
s.base=(int *)realloc(s.base,(s.stacksize+crement)*sizeof(int));
if(!s.base) exit (overflow);
s.top=s.base+s.stacksize;
s.stacksize+=crement;
}
*s.top++=e;
return ok;
}
Pop(sqstack &s){
int e;
if(s.top==s.base)return error;
e=*--s.top;
return (e);
}
float operae(float a,char theta,float b){
float c;
switch(theta){
case'+':c=a+b;
case'-':c=a-b;
case'*':c=a*b;
case'/':c=a/b;
}
return (c);
}
int In(char c)
{
char ch[7]={'+','-','*','/','#','(',')'};
int i;
for(i = 0; i < 7; i++)
if(c == ch[i])
return 1;
return 0;
}
float EvalExpres(){
sqstack optr,opnd;
int a,b;char c;
initstack(optr);push(optr,'#');
initstack(opnd);c=getchar();
while(c!='#'||(gettop(optr))!='#'){
if(!In(c)){push(opnd,c);
c=getchar();}
else
switch(Proceed(gettop(opnd),c)){
case'<':push(optr,c);c=getchar();
case'=':Pop(optr);c=getchar();
break;
case'>':Pop(opnd);
Pop(opnd);Pop(opnd);
push(opnd,operae(a,theta,b));
break;
}
}
return gettop(opnd);
}
void main(){
float c;
sqstack optr,opnd;
c=EvalExpres();
printf("The result is:%d\n",c);
}
算术表达式求值:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算符优先关系,实现对算术四则混合运算表达式的求值
请高手帮我改一下这个程序
答案:1 悬赏:50 手机版
解决时间 2021-06-02 03:22
- 提问者网友:我一贱你就笑
- 2021-06-01 02:42
最佳答案
- 五星知识达人网友:笑迎怀羞
- 2021-06-01 02:56
你好哦楼主~
很高兴看到你的问题。
但是又很遗憾到现在还没有人回答你的问题。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦。
可能是你问的问题有些专业了,没人会。或者别人没有遇到或者接触过你的问题,所以帮不了你。建议你去问题的相关论坛去求助,那里的人通常比较多,也会比较热心,能快点帮你解决问题。
希望我的回答能够帮到你。。
很高兴看到你的问题。
但是又很遗憾到现在还没有人回答你的问题。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦。
可能是你问的问题有些专业了,没人会。或者别人没有遇到或者接触过你的问题,所以帮不了你。建议你去问题的相关论坛去求助,那里的人通常比较多,也会比较热心,能快点帮你解决问题。
希望我的回答能够帮到你。。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯