小弟正做编译原理的课程设计(快到期了)遇到这么个问题:现有字符串表达式如:a+b*c-d,放在数组char aa[]中,另有两个数组分别存放a,b,c,d及其对应的值,abcd和其值存放的位置相同,char bb[] 中分别存放a,b,c,dint cc[]中放的是值1,2,3,4(即a的值是1,b的值是2,c的值是3,d的值是4)请问如何得到表达式的值,(给出算法思路也好啊!)多谢了!!!!

解决方案 »

  1.   

    给你一个C程序,很容易改成Java的了。#include<stdio.h> 
    #define STACKINCREMENT 10 
    #define stacksize 100 
    #define OK 1 
    #define ERROR 0 
    #define Status char 
    typedef struct{ 
    SElemType *base; 
    SElemType *top; 
    int stacksize; 
    }Sqtack; Status precede(GetTop(OPTR),c) 

    if(GetTop(OPTR)=='+'||GetTop(OPTR)=='-') 
    if(c=='+'||c=='-'||c==')'||c=='#') 
    return('>'); 
    else 
    return('<'); 
    if(GetTop(OPTR)=='*'||GetTop(OPTR)=='/') 
    if(c=='(') 
    return('<'); 
    else 
    return('>'); 
    if(GetTop(OPTR)=='(') 
    if(c==')') 
    return('='); 
    if(c=='#') 
    return(' '); 
    else 
    return('<'); 
    if(GetTop(OPTR)==')') 
    if(c=='(') 
    return(' '); 
    else 
    return('>'); 
    if(GetTop(OPTR)=='#') 
    if(c=='#') 
    return('='); 
    if(c==')') 
    return( ); 
    else 
    return('<'); 

    Status In(c,OP) 

    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#') 
    return(1); 
    else 
    return(0); 

    Status Operate(a,theta,b) 

    status sum,m,n; 
    m=*a,n=*b; 
    if(theta=='*') 
    sum=m*n; 
    if(theta=='/') 
    sum=m/n; 
    if(theta=='+') 
    sum=m+n; 
    if(theta=='-') 
    sum=m-n; 
    return(sum); 

    OperandType EvaluateExpression() 

    Status a,b,c; 
    InitStack(OPTR); 
    push(OPTR,'#' ); 
    Initstack(OPND); 
    c=getchar(); 
    while(c!='#'||Gettop(OPTR)!='#') 

    if(!In(c,OP)){Push(OPND,c);c=getchar();} 
    else 
    swtich(precede(Gettop(OPTR),c)) 
    {case'<':Push(OPTR,c);c=getchar;break; 
    case'=':Pop(OPTR,x);c=getchar();break; 
    case'>':Pop(OPTR,theta);Pop(OPND,b);pop(OPND,a);Push(OPND,operate(a,theta,b));break; 


    return GetTop(OPND); 

    Status InitStack(SqStack *OPTR) 

    OPTR->base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType )); 
    if(!OPTR->base) exit (OVERFLOW); 
    OPTR->top=OPTR->base; 
    OPTR->stacksize=STACK_INIT_SIZE; 
    return OK; 

    Status Push(SqStack *OPTR,SElemType e) 

    if(OPTR->top-OPTR->base>=OPTR->stacksize) 

    OPTR->base=(SElemType *)realloc(OPTR->base,(OPTR->stacksize+STACKINCREMENT)*sizeof(SElemType )); 
    if(!OPTR->base) exit (OVERFLOW); 
    OPTR->top=OPTR->base+OPTR->stacksize; 
    OPTR->stacksize+=STACKINCREMENT; 

    *(OPTR->top)=e;OPTR->top++; 
    return OK; 

    Status GetTop(SqStack OPTR,SElemType *p) 

    if(OPTR.top==OPTR.base) return ERROR; 
    *p=*(OPTR.top-1); 
    return OK; 

    SElemType Pop(SqStack *OPTR) 

    SElemType e; 
    if(OPTR->top==OPTR->base) return ERROR; 
    e=*--OPTR->top; 
    return e; 

    Status InitStack(SqStack *OPND) 

    OPND->base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType )); 
    if(!OPND->base) exit (OVERFLOW); 
    OPND->top=OPND->base; 
    OPND->stacksize=STACK_INIT_SIZE; 
    return OK; 

    Status Push(SqStack *OPND,SElemType e) 

    if(OPND->top-OPND->base>=OPND->stacksize) 

    OPND->base=(SElemType *)realloc(OPND->base,(OPND->stacksize+STACKINCREMENT)*sizeof(SElemType )); 
    if(!OPND->base) exit (OVERFLOW); 
    OPND->top=OPND->base+OPND->stacksize; 
    OPND->stacksize+=STACKINCREMENT; 

    *(OPND->top)=e;OPND->top++; 
    return OK; 

    SElemType Pop(SqStack *OPND) 

    SElemType e; 
    if(OPND->top==OPND->base) return ERROR; 
    e=*--OPND->top; 
    return e; 

    main() 

    float result; 
    EvaluateExpression(); } 
      

  2.   

    不过c中的指针问题 ,在java中是很麻烦