主题:能帮偶看下这个表达式运算的程序么?
运行的时候好像一直停留在函数expred()中的循环里了
不知道是哪里写错了……
/*数据结构_栈和队列实验_表达式运算*/
#include "stdio.h"
#include "math.h"
#include "conio.h"
#define N 10
char proceed(char ch1,char ch2)
{
char r;
switch(ch1)
{case '+':;
case '-':switch(ch2)
{case '*':;
case '/':;
case '(':r='<';
break;
default:r='>';
}break;
case '*':;
case '/':switch(ch2)
{case '(':r='<';
break;
default:r='>';
}break;
case '(':switch(ch2)
{
case ')':r='='; break;
case '#':r='e';break;
/*case '-':r='!';break;*/
default:r='<';
}break;
case ')':switch(ch2)
{
case '(':r='e';break;
default:r='>';
}break;
case '^':switch(ch2)
{
case '(':r='<';break;
default:r='>';
}break;
case '#':switch(ch2)
{
case ')':r='e';break;
case '#':r='=';break;
default:r='<';
}break;
}
return r;
}
double caculate(double a,char ch,double b)
{
double r;
switch(ch)
{
case '+':r=a+b;break;
case '-':r=a-b;break;
case '*':r=a*b;break;
case '/':r=a/b;break;
case '^':r=pow(a,b);break;
}
return r;
}
struct optp
{
char s[N+2];
int top;
}op;
struct datp
{
double s[N];
int top;
}da;
double expred(char str[])
{
double r,a,b,c;
char ch,s[N+1]; /*s[]用于存放待转换为数字的字符串*/
int i;
da.top=0;
op.top=0;
op.s[++op.top]='#';
i=0;
strcat(str,'#'); /*给表达式前后加上'#'*/
while(op.s[op.top]!='#'||str[i]!='#')
if(str[i]>='0'&&str[i]<='9'||str[i]=='.')
{
int j=0;
while(str[i]>='0'&&str[i]<='9'||str[i]=='.')
s[j++]=str[i++];
s[j]='\0';
r=atof(s);
da.s[++da.top]=r;
}
else switch (proceed(op.s[op.top],str[i]))
{
case '<':op.s[++op.top]=str[i++];break;
case '=':op.top--;i++;break;
case '>':ch=op.s[op.top--];
b=da.s[da.top--];
a=da.s[da.top--];
r=caculate(a,ch,b);
da.s[++da.top]=r;break;
/*case '!':ch='-';
b=da.s[da.top--];
a=0;
r=caculate(a,ch,b);
da.s[++da.top]=r;break;*/
case 'e':exit(0);
}
return da.s[da.top];
}
main()
{
char str[N+2];
gets(str);
printf("%f\n",expred(str));
getch();
}
不知道是哪里写错了……
/*数据结构_栈和队列实验_表达式运算*/
#include "stdio.h"
#include "math.h"
#include "conio.h"
#define N 10
char proceed(char ch1,char ch2)
{
char r;
switch(ch1)
{case '+':;
case '-':switch(ch2)
{case '*':;
case '/':;
case '(':r='<';
break;
default:r='>';
}break;
case '*':;
case '/':switch(ch2)
{case '(':r='<';
break;
default:r='>';
}break;
case '(':switch(ch2)
{
case ')':r='='; break;
case '#':r='e';break;
/*case '-':r='!';break;*/
default:r='<';
}break;
case ')':switch(ch2)
{
case '(':r='e';break;
default:r='>';
}break;
case '^':switch(ch2)
{
case '(':r='<';break;
default:r='>';
}break;
case '#':switch(ch2)
{
case ')':r='e';break;
case '#':r='=';break;
default:r='<';
}break;
}
return r;
}
double caculate(double a,char ch,double b)
{
double r;
switch(ch)
{
case '+':r=a+b;break;
case '-':r=a-b;break;
case '*':r=a*b;break;
case '/':r=a/b;break;
case '^':r=pow(a,b);break;
}
return r;
}
struct optp
{
char s[N+2];
int top;
}op;
struct datp
{
double s[N];
int top;
}da;
double expred(char str[])
{
double r,a,b,c;
char ch,s[N+1]; /*s[]用于存放待转换为数字的字符串*/
int i;
da.top=0;
op.top=0;
op.s[++op.top]='#';
i=0;
strcat(str,'#'); /*给表达式前后加上'#'*/
while(op.s[op.top]!='#'||str[i]!='#')
if(str[i]>='0'&&str[i]<='9'||str[i]=='.')
{
int j=0;
while(str[i]>='0'&&str[i]<='9'||str[i]=='.')
s[j++]=str[i++];
s[j]='\0';
r=atof(s);
da.s[++da.top]=r;
}
else switch (proceed(op.s[op.top],str[i]))
{
case '<':op.s[++op.top]=str[i++];break;
case '=':op.top--;i++;break;
case '>':ch=op.s[op.top--];
b=da.s[da.top--];
a=da.s[da.top--];
r=caculate(a,ch,b);
da.s[++da.top]=r;break;
/*case '!':ch='-';
b=da.s[da.top--];
a=0;
r=caculate(a,ch,b);
da.s[++da.top]=r;break;*/
case 'e':exit(0);
}
return da.s[da.top];
}
main()
{
char str[N+2];
gets(str);
printf("%f\n",expred(str));
getch();
}