表达式求值问题
											完成[ 本帖最后由 keep_on 于 2012-12-5 18:17 编辑 ]
 程序代码:
程序代码:#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;
}这是我以前写的,跟你共享下 
										
					
	