表达式求值问题
完成[ 本帖最后由 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; }这是我以前写的,跟你共享下