作业帮 > 综合 > 作业

我用C语言写一个关于算术表达式求值的程序.(用数据结构中的栈知识)

来源:学生作业帮 编辑:灵鹊做题网作业帮 分类:综合作业 时间:2022/05/26 13:12:02
我用C语言写一个关于算术表达式求值的程序.(用数据结构中的栈知识)
我用C语言写一个关于算术表达式求值的程序.(用数据结构中的栈知识)
/*在TC2 和 VC6下都可以顺利运行.
做了一个下午.一定要用我这个噢.
有简单的输入错误检测.有完整的说明和
注释*/
#include /*库文件包含*/
#include /*用于字符串操作*/
#include /*用于exit函数*/
//
double good(char *c) /*可递归函数*/
{ /*取得数值字符串,并调用convnum转换成double*/
char g[100],number[30]; /*g,保存当前的表达式串,number保存一个数的所有字符*/
char f[80]; /*保存所有的符号的堆栈*/
int fi=0; /*保存符号的位置指针*/
double s[80]; /*保存当前所有的数的一个堆栈*/
int si=0; /*保存数字位置指针*/
int k=0; /* 若k=1则表示有一对括号*/
int num=0,i=0; /*num保存新括号内的字符数,i 保存number里的字符位置*/
int cc=0; /*乘除符号数量*/
int jj=0; /*加减符号数量*/
while(*c!='\0')/*当p==1 和k==0时,表示已经把括号里的内容全部复制到g[100]中了*/
{
k=0;
num=0;
switch(*c)
{
case '+':/*当前字符为+-乘除时则表示*/
case '-':
case '*':
case'/':
f[fi++]=*c;
if(*c=='*' || *c=='/')
cc++;
else
jj++;
if(*(c-1)!=')')
{
number[i]='\0';
i=0;/*完成一个数字的复制,其位置指针i=0*/
s[si++]=convnum(number);
}
break;
case'(':/*有括号,则将当前括号作用范围内的全部字符保存,作为*/
k++; /*一个新的字符表达式进行递归调用good函数计算.*/
while(k>0)
{
c++;
g[num]=*c;
num++;
if(*c==')')
{
k--;
}
else if(*c=='(')
{
k++;
}
}
g[num-1]='\0';
num=0;/*完成一个括号内容的复制,其位置指针num=0*/
s[si++]=good(g);
break;
default:
number[i++]=*c;
if(*(c+1)=='\0')
{ number[i]='\0';
s[si++]=convnum(number);
}
break;
}
c++;
}
f[fi]='\0';
i=0;
while(cc>0)
{
switch(f[i])
{
case '*':cc--;
s[i+1]=s[i]*s[i+1];
move(f,s,i);
break;
case '/':cc--;
s[i+1]=s[i]/(float)s[i+1];
move(f,s,i);
break;
default:
i++;
break;
}
}
i=0;
while(jj>0)
{
switch(f[i])
{
case '+':s[i+1]=s[i]+s[i+1];
jj--;
move(f,s,i);
break;
case '-':s[i+1]=s[i]-s[i+1];
jj--;
move(f,s,i);
break;
default:
printf("operator error!");
break;
}
}
return s[0];
}
void main()
{
char str[100];
double sum=0;
int p=1;
while(1)
{
printf("enter expression:enter 'exit' end of program\n");
scanf("%s",str);
p=strcmp(str,"exit");
if(p==0)
break;
p=check(str);
if(p==0)
continue;
sum=good(str);
printf("%s=%f",str,sum);
printf("\n");
}
printf("good bye!\n");
}
例:
enter expression:enter 'exit' end of program
3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6(输入)
3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6=384.266667
enter expression:enter 'exit' end of program
china(输入)
input error,there have the char not the math expression char!
enter expression:enter 'exit' end of program
exit(输入)
good bye!