#include<iostream> #include<cstring> #include<stdio.h> #include<stack> using namespace std; #define OPSETSIZE 7 unsigned char Prior[7][7] = { { '>', '>', '<', '<', '<', '>', '>' }, { '>', '>', '<', '<', '<', '>', '>' }, { '>', '>', '>', '>', '<', '>', '>' }, { '>', '>', '>', '>', '<', '>', '>' }, { '<', '<', '<', '<', '<', '=', ' ' }, { '>', '>', '>', '>', ' ', '>', '>' }, { '<', '<', '<', '<', '<', ' ', '=' } }; char OPSET[OPSETSIZE]= { '+', '-', '*', '/', '(', ')', '#' }; int ReturnOpOrd(char op, char* TestOp) { int i; for (i = 0; i < OPSETSIZE; i++) { if (op == TestOp[i]) return i; } return 0; } char precede(char Aop, char Bop) { return Prior[ReturnOpOrd(Aop, OPSET)][ReturnOpOrd(Bop, OPSET)]; } int In(char Test, char* TestOp) { int Find = 0; int i; for (i = 0; i < OPSETSIZE; i++) { if (Test == TestOp[i]) Find = 1; } return Find; } int Operate(int a, unsigned char theta, int b) { switch (theta) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } int EvaluateExpression(char* MyExpression) { stack<char> OPTR; stack<int> OPND; char TempData[20]; int Data, a, b; char *c, Dr[2]; int theta; OPTR.push( '#'); c = MyExpression; strcpy(TempData, "\0"); while (*c != '#' || OPTR.top() != '#') { if (!In(*c, OPSET)) { Dr[0] = *c; Dr[1] = '\0'; strcat(TempData, Dr); c++; if (In(*c, OPSET)) { Data = atoi(TempData); OPND.push(Data); strcpy(TempData, "\0"); } } else { switch (precede(OPTR.top(), *c)) { case '<': // 栈顶元素优先权低 OPTR.push( *c); c++; break; case '=': // 脱括号并接收下一字符 OPTR.pop(); c++; break; case '>': // 退栈并将运算结果入栈 theta=OPTR.top(); OPTR.pop(); b=OPND.top(); OPND.pop(); a=OPND.top(); OPND.pop(); OPND.push(Operate(a, theta, b)); break; } } } return OPND.top(); } int main(){ char MyExpression[100]; while(gets(MyExpression) && strlen(MyExpression)){ printf("%d\n", EvaluateExpression(MyExpression)); } return 0; }
|