表达式求值问题
完成[ 本帖最后由 keep_on 于 2012-12-5 18:17 编辑 ]
2012-12-03 20:44
2012-12-04 13:16
2012-12-04 14:55
2012-12-04 22:20
2012-12-04 22:58
你好厉害!你也是财大信管学院的吧?
2012-12-05 18:12
2012-12-05 18:17
2012-12-05 19:30
程序代码:#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
float *base;
float *top;
int stack_size;
}sqstack;//操作数栈的声明
typedef struct
{
char *base;
char *top;
int stack_size;
}Sqstack;//运算符栈的声明
/*
**运算符栈的基本操作
*/
int Initstack1(Sqstack &OPTR)
{
OPTR.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!OPTR.base)
return 0;
OPTR.top=OPTR.base;
OPTR.stack_size=STACK_INIT_SIZE;
return 1;
}
int Push1(Sqstack &OPTR,char e)
{
if(OPTR.top-OPTR.base>=OPTR.stack_size)
{
OPTR.base=(char*)realloc(OPTR.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));
if(!OPTR.base)
return 0;
OPTR.top=OPTR.base+OPTR.stack_size;
OPTR.stack_size+=STACKINCREMENT;
}
*OPTR.top++=e;
return 1;
}
int Pop1(Sqstack &OPTR,char &e)
{
if(OPTR.top==OPTR.base)
return 0;
else
e=*--OPTR.top;
return 1;
}
char getTop1(Sqstack &OPTR)
{
if(OPTR.top==OPTR.base)
return 0;
else
return (*(OPTR.top-1));
}
/*
** 操作数栈的基本操作
*/
int Initstack(sqstack &S)
{
S.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
if(!S.base)
return 0;
S.top=S.base;
S.stack_size=STACK_INIT_SIZE;
return 1;
}
int Push(sqstack &S,float e)
{
if(S.top-S.base>=S.stack_size)
{
S.base=(float *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(float));
if(!S.base)
return 0;
S.top=S.base+S.stack_size;
S.stack_size+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Pop(sqstack &S,float &e)
{
if(S.top==S.base)
return 0;
e=*--S.top;
return 1;
}
float getTop(sqstack &S)
{
if(S.top==S.base)
return 0;
return(*(S.top-1));
}
int In(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')')//这里不要漏写了,要不然影响结果!
return 1;
else
return 0;
}
char Precede(char a,char b)
{
int i,j;
char op[8][8]={{' ','+','-','*','/','(',')','#'},{'+','>','>','<','<','<','>','>'},{'-','>','>','<','<','<','>','>'},{'*','>','>','>','>','<','>','>'},{'/','>','>','>','>','<','>','>'},
{'(','<','<','<','<','<','=',' '},{')','>','>','>','>',' ','>','>'},{'#','<','<','<','<','<',' ','='}};
for(i=0;i<8;i++)
{
if(a==op[i][0])
break;
}
for(j=0;j<8;j++)
{
if(b==op[0][j])
break;
}
return op[i][j];
}
float Operate(float a,char theta,float b)//这个没有错!
{
float c;
switch(theta)
{
case '+':
c=a+b;
break;
case '-':
c=a-b;
break;
case '*':
c=a*b;
break;
case '/':
c=a/b;
break;
}
return c;
}
float EvalueateExpression(sqstack OPND,Sqstack OPTR)
{
char c,x,theta;
float a,b,i;
Push1(OPTR,'#');
c=getchar();
while(c!='#'||getTop1(OPTR)!='#')
{
if(!In(c))
{
i=(float)(c-48);
Push(OPND,i);
c=getchar();
}
else
{
switch(Precede(getTop1(OPTR),c))
{
case '<':
Push1(OPTR,c);
c=getchar();
break;
case '=':
Pop1(OPTR,x);c=getchar();
break;
case '>':
Pop(OPND,b);
Pop(OPND,a);
Pop1(OPTR,theta);
Push(OPND,Operate(a,theta,b));
break;
}
}
}
return getTop(OPND);
}
int main()
{
float m;
Sqstack OPTR;
sqstack OPND;
Initstack(OPND);
Initstack1(OPTR);
printf("please input a expression end with '#',and the number is between 0-9!\n");
m=EvalueateExpression(OPND,OPTR);
printf("结果是:%.2f\n",m);
return 0;
}这是我以前写的,跟你共享下

2012-12-05 21:48
2012-12-05 21:53