#include "./stack/stack.h" #include<stdlib.h> SElemType Precede(SElemType t1, SElemType t2) { SElemType f; switch(t2) { case '+': case '-': if(t1 == '(' || t1 == '=') f = '<'; else f = '>'; break; case '*': case '/': if(t1 == '*' || t1 == '/' || t1 == ')') f = '>'; else f = '<'; break; case '(': if(t1 == ')') { printf("ERROR\n"); exit(ERROR); } else { f = '<'; } break; case ')': switch(t1) { case '(': f='='; break; case '=':printf("ERROR\n"); exit(ERROR); default: f = '>'; } break; case '=': switch(t1) { case '=': f='='; break; case '(': printf("ERROR\n"); exit(ERROR); default: f = '>'; } } return f; } Status In(SElemType c) { switch (c) { case '+': case '-': case '*': case '/': case '(': case ')': case '=': return TRUE; default: return FALSE; } } SElemType Operate(SElemType a, SElemType theta, SElemType b) { SElemType 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; } SElemType EvalueteExpresion() { SqStack OPTR,OPND; SElemType a, b, d, x, theta; char c; char z[6]; int i; InitStack(OPTR); Push(OPTR, '='); InitStack(OPND); c = getchar(); GetTop(OPTR, x); while(c != '=' || x != '=') { if(In(c)) { switch (Precede(x, 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; } } else if(c >= '0' && c <= '9') { i = 0; do{ z[i++] = c; c = getchar(); }while(c >= '0' && c <= '9'); z[i] = '\0'; d = atoi(z); Push(OPND, d); } else { printf("ERROR\n"); exit(ERROR); } GetTop(OPTR, x); } GetTop(OPND, x); return x; } int main() { printf("请输入算术表达式,负数要(0-正数),并以=结束\n"); printf("%d\n",EvalueteExpresion()); return 0; }