#include<stdio.h>
#define ERROR 0#define OK 1#define STACKINCREAMENT 10#define STACK_INT_SIZE 100#define OVERFLOW -2 typedef int status;typedef char SElemtype;#include<malloc.h>#include<stdlib.h>#include<conio.h>#include<string.h>#include<windows.h> typedef struct{ SElemtype *base; SElemtype *top; status stacksize; }sqstack; typedef struct{ int *base; int *top; status stacksize; }whstack; void init(sqstack *s){ s->base=(SElemtype*)malloc(STACK_INT_SIZE*sizeof(SElemtype)); if(!s->base) exit(OVERFLOW); s->top=s->base; s->stacksize=STACK_INT_SIZE; } void Seinit(whstack *s){ s->base=(int*)malloc(STACK_INT_SIZE*sizeof(int)); if(!s->base) exit(OVERFLOW); s->top=s->base; s->stacksize=STACK_INT_SIZE; } char gettop(sqstack *s,SElemtype *e){ if(s->top==s->base) return ERROR; e=s->top-1; return *e; }status Segettop(whstack *s,int *e){
if(s->top==s->base) return ERROR; e=s->top-1; return *e; } void push(sqstack *s,SElemtype e){ if(s->top-s->base>=s->stacksize){ s->base = (SElemtype*)realloc(s->base,(s->stacksize+STACKINCREAMENT)*sizeof(SElemtype)); if(!s->base) exit(OVERFLOW); s->top=s->base+s->stacksize; s->stacksize+=STACKINCREAMENT;} *s->top++=e; }void Sepush(whstack *s,SElemtype e){
if(s->top-s->base>=s->stacksize){ s->base = (int*)realloc(s->base,(s->stacksize+STACKINCREAMENT)*sizeof(int)); if(!s->base) exit(OVERFLOW); s->top=s->base+s->stacksize; s->stacksize+=STACKINCREAMENT;} *s->top++=e; }status pop(sqstack *s,SElemtype *e){
if(s->top==s->base) return ERROR; *e=*--s->top; return OK; } status Sepop(whstack *s,int *e){ if(s->top==s->base) return ERROR; *e=*--s->top; return OK; }int char_to_num(char s){
if(s>=49&&s<=57){ s=s-48; return s; } else return 0; }
char precede(char a,char b){
int i,j; char compare[8][8]={' ','+','-','*','/','(',')','#', '+','>','>','<','<','<','>','>', '-','>','>','<','<','<','>','>', '*','>','>','>','>','<','>','>', '/','>','>','>','>','<','>','>', '(','<','<','<','<','<','>',' ', ')','>','>','>','>',' ','>','>', '#','<','<','<','<','<',' ','=', }; for(i=0;i<8;i++) if(compare[0][i]==a) break; for(j=0;j<8;j++) if(compare[j][0]==b) break; return compare[j][i]; } int operate(int a,char x,int c){ int y; switch(x) { case '+':y=a+c;break; case '-':y=a-c;break; case '*':y=a*c;break; case '/':y=a/c;break; default:return 0;break; } return y; }int evaluateexpression(){
char c[100]; sqstack OPTR; whstack OPND; int a,b,d,i=0; char x,theta,ch,y; init(&OPTR); push(&OPTR,'#'); Seinit(&OPND);printf("请输入表达式(以#结尾):\n"); scanf("%s",c); while(1){ if(char_to_num(c[i])){ Sepush(&OPND,char_to_num(c[i++])); }else if(c[i]=='+'||c[i]=='-'||c[i]=='*'||c[i]=='/'||c[i]=='('||c[i]==')'||c[i]=='#') { switch(precede(c[i],gettop(&OPTR,&ch))) { case '<':push(&OPTR,c[i++]);break; case '=':pop(&OPTR,&x);break; case '>':pop(&OPTR,&theta); Sepop(&OPND,&b); Sepop(&OPND,&a); Sepush(&OPND,operate(a,theta,b)); break; default:break; } } if(c[i]=='#'&&gettop(&OPTR,&y)=='#'){ printf("结果=%d\n",Segettop(&OPND,&d)); return OK; }
} }
int main(){
printf(" 算术表达式求值\n");evaluateexpression();
getch(); }