算术表达式的求值----《数据结构》
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 100 typedef int Status; typedef char SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack &S) { S.base=(SElemType*)malloc(sizeof(SElemType)*MAXSIZE); if(!S.base) exit(-2); S.top=S.base; S.stacksize=MAXSIZE; return 1; } Status Push(SqStack &S,SElemType e) { if(S.top-S.base==S.stacksize) return 0; *S.top++=e; return 1; } Status Pop(SqStack &S,SElemType &e) { if(S.top==S.base) return 0; e=*--S.top; return 1; } SElemType GetTop(SqStack S) { if(S.top!=S.base) return *(S.top-1); } int In(SElemType e) { if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='#') return 1; else return 0; } SElemType Precede(SElemType a,SElemType b) { SElemType f; if(a=='+'||a=='-') { if(b=='+'||b=='-'||b==')'||b=='#') f='>'; else if(b=='*'||b=='/'||b=='(') f='<'; } else if(a=='*'||a=='/') { if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#') f='>'; else if(b=='(') f='<'; } else if(a=='(') { if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(') f='<'; else if(b==')') f='='; } else if(a==')') { if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#') f='>'; } else if(a=='#') { if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(') f='<'; else if(b=='#') f='='; } return f; } SElemType Operate(SElemType a,SElemType theta,SElemType b) { SElemType c; a=a-'0'; b=b-'0'; if(theta=='+') c=a+b+'0'; else if(theta=='-') c=a-b+'0'; else if(theta=='*') c=a*b+'0'; else if(theta=='/') c=a/b+'0'; return c; } int EvaluateExpression() { SqStack OPND,OPTR; char ch,a,b,theta,x; InitStack(OPND); InitStack(OPTR); Push(OPTR,'#'); ch=getchar(); while(ch!='#'||GetTop(OPTR)!='#') { if(!In(ch)) { Push(OPND,ch); ch=getchar(); } else { switch(Precede(GetTop(OPTR),ch)) { case '<': Push(OPTR,ch); ch=getchar(); break; case '>': Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break; case '=': Pop(OPTR,x); ch=getchar(); break; } } } return GetTop(OPND)-'0'; } int main() { printf("请输入算术表达式,并以#结束\n"); printf("结果是: %d\n",EvaluateExpression()); return 0; }