[原创]算术表达式求值演示
我的一个同学找我搞定数据结构的实验报告,因为只有2天的时间,我就胡乱做了个。
下面是运行后生成的应用程序,给大家看看效果。(开始发的那个运行太快,看不见,请重新下载)
这是按照《数据结构习题集》严蔚敏版的实验2.5做的。
至于完整源代码,我下个星期5以后再发出来(呵呵,一点私心,防止上交的报告中有重复的)。
这里把关键的函数发出来。
int power(char x,int &base)// base用来保证括号内运算权限比括号外高(最关键的地方,运算符的权值设定)
{
int power;
if(x=='+'||x=='-')
power=base+1;
if(x=='*'||x=='/')
power=base+2;
if(x=='(')
{
power=3;
base+=3;
}
if(x==')')
{
power=-1;
base+=3;
}
if('0'<=x&&x<='9')
power=0;
}
void guocheng(char *infix)//整个算术表达式运算的过程,请在适当位置自行添加显示OPTR,OPND栈中内容和操作的函数(现在这个函数相当于算法)
{
int a,b,c,base=0,i;
char x,y;
for (i = 0; infix[i] != '\0'; i++)
{
x=infix[i];
if (power(x)==0)//数字就入栈
{
a=x-'0';
push(opnd,a);
}
else if(power(x)==3)// 遇到'('就进栈
{
push(optr,c);
}
else if (power(x)==-1)//')',运算消除一对()
{
a=pop(opnd);
b=pop(opnd);
y=pop(optr);
c=math(b,y,a);
push(opnd,c);
y=pop(optr);
if(y=='('); //考虑如3+5*(3+5*6)
else
{
a=pop(opnd);
b=pop(opnd);
c=math(b,y,a);
push(opnd,c);
pop(optr);
}
}
else
{
if(power(x)>power(top(optr))) //如果运算符权值打于栈顶元素的权值,就入栈
push(optr,x);
else //权值相同情况下就先计算前面的。
{
a=pop(opnd);
b=pop(opnd);
y=pop(optr);
c=math(b,y,a);
push(opnd,c);
push(optr,x);
}
}
}//for
y=pop(optr);
while(y)
{
a=pop(opnd);
b=pop(opnd);
c=math(b,y,a);
push(opnd,c);
y=pop(optr);
}
}
这个是老版本了,只有一个可执行文件,请到第3楼下载新版本,有原代码
[此贴子已经被作者于2006-4-25 10:46:35编辑过]