主题:请高手来赐教一下
tossboy
[专家分:160] 发布于 2006-04-26 22:02:00
设计一个对简化程序。如输入表达式:12*(2+6/2)-4*3后,程序能够求出该表达式的结果值:或表达式有语法逻辑问题,请给出提示
回复列表 (共5个回复)
沙发
rickone [专家分:15390] 发布于 2006-04-27 13:44:00
这个就是表达式求值问题,书上有算法。
板凳
tossboy [专家分:160] 发布于 2006-04-27 17:04:00
请问有没有具体的程序代码
3 楼
rickone [专家分:15390] 发布于 2006-04-27 19:57:00
这个论坛有网友写过,你可以参考看一下,置顶里有链接,或者搜一下。
4 楼
flysun0311 [专家分:2040] 发布于 2006-04-28 23:55:00
/*栈的应用:求表达式值*/
#include <stdio.h>
#define MAX 100
char exp[MAX]; /*存储转换成的后缀表达式*/
void trans() /*将算术表达式转换成后缀表达式*/
{
char str[MAX]; /*存储原算术表达式*/
char stack[MAX]; /*作为栈使用*/
char ch;
int sum,i,j,t,top=0;
/*t作为exp的下标,top作为stack的下标,i作为str的下标*/
printf("***************************************************************\n");
printf("* 输入一个求值的表达式,以#结束。只能包含+,-,*,/运算符和正整数 *\n");
printf("***************************************************************\n");
printf("算术表达式:");
i=0; /*获取用户输入的表达式*/
do
{
i++;
scanf("%c",&str[i]);
} while (str[i]!='#' && i!=MAX);
sum=i; /*记录输入表达式总的字符个数*/
t=1;i=1;
ch=str[i];i++;
while (ch!='#')
{
switch(ch)
{
case '(': /*判定为左括号*/
top++;stack[top]=ch;
break;
case ')': /*判定为右括号*/
while (stack[top]!='(')
{
exp[t]=stack[top];top--;t++;
}
top--;
break;
case '+': /*判定为加减号*/
case '-':
while (top!=0 && stack[top]!='(')
{
exp[t]=stack[top];top--;t++;
}
top++;stack[top]=ch;
break;
case '*': /*判定为'*'或'/'号*/
case '/':
while (stack[top]=='*' || stack[top]=='/')
{
exp[t]=stack[top];top--;t++;
}
top++;stack[top]=ch;
break;
case ' ':break;
default:
while (ch>='0' && ch<='9') /*判定为数字*/
{
exp[t]=ch;t++;
ch=str[i];i++;
}
i--;
exp[t]='#';t++;
}
ch=str[i];i++;
}
while (top!=0)
{
exp[t]=stack[top];t++;top--;
}
exp[t]='#';
printf("\n\t原来表达式:");
for (j=1;j<sum;j++) printf("%c",str[j]);
printf("\n\t后缀表达式:",exp);
for (j=1;j<t;j++) printf("%c",exp[j]);
}
void compvalue() /*计算后缀表达式的值*/
{
float stack[MAX],d; /*作为栈使用*/
char ch;
int t=1,top=0; /*t作为exp的下标,top作为stack的下标*/
ch=exp[t];t++;
while (ch!='#')
{
switch (ch)
{
case '+':stack[top-1]=stack[top-1]+stack[top];
top--;break;
case '-':stack[top-1]=stack[top-1]-stack[top];
top--;break;
case '*':stack[top-1]=stack[top-1]*stack[top];
top--;break;
case '/':if (stack[top]!=0)
stack[top-1]=stack[top-1]/stack[top];
else
{
printf("\n\t除零错误!\n");
exit(0);/*异常退出*/
}
top--;break;
default:
d=0;
while (ch>='0' && ch<='9') /*判定为数字字符*/
{
d=10*d+ch-'0'; /*将数字字符转换成对应的数值*/
ch=exp[t];t++;
}
top++;
stack[top]=d;
}
ch=exp[t];t++;
}
printf("\n\t计算结果:%g\n",stack[top]);
}
main()
{
trans();
compvalue();
}
5 楼
tossboy [专家分:160] 发布于 2006-04-29 10:26:00
谢谢 太帅了
我来回复