#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <string> #include <cstdlib> #include <stdio.h> #include<algorithm> #include<stack> using namespace std; class calc{ private: char * expression; enum token {OPAREN,ADD,SUB,MULTI,DIV,EXP,CPAREN,VALUE,ENL}; void Binaryop(token op, stack<int> &datastack);// token getop(int &value);// public: calc(char* s); ~calc(){delete [] expression;} int result(); }; calc::calc(char*s) { expression = new char[strlen(s)+1]; strcpy(expression,s); } calc::token calc::getop(int &value) { value = 0; while(*expression) { while(*expression && *expression == ' ') ++expression; if(*expression >= '0' && *expression <= '9') { while(*expression >= '0' && *expression <= '9') { value = value * 10 + (*expression)-'0'; expression ++; } return VALUE; } switch (*expression) { case '(': expression++;return OPAREN;break; case ')': expression++;return CPAREN;break; case '+': expression++;return ADD;break; case '-': expression++;return SUB;break; case '*': expression++;return MULTI;break; case '/': expression++;return DIV;break; case '^': expression++;return EXP;break; default: break; } } return ENL; } void calc::Binaryop(token op, stack<int> & datastack) { int num2 = datastack.top(); datastack.pop(); int num1 = datastack.top(); datastack.pop(); switch (op) { case ADD: datastack.push(num1+num2);break; case SUB: datastack.push(num1-num2);break; case MULTI: datastack.push(num1*num2);break; case DIV: datastack.push(num1/num2);break; case EXP: datastack.push(pow(num1,num2));break; default: break; } } int calc::result() { token nextop,topop; stack<token> opstack; stack<int> datastack; int resultvalue; int currentvalue; while(1) { currentvalue = 0; nextop = getop(currentvalue); if (nextop==ENL) break; switch (nextop) { case VALUE:datastack.push(currentvalue);break; case OPAREN:opstack.push(OPAREN);break; case EXP: opstack.push(EXP);break; case ADD: case SUB: while(!(opstack.empty()) && (topop=opstack.top())!=OPAREN) { Binaryop(opstack.top(),datastack); opstack.pop(); } opstack.push(nextop);break; case MULTI: case DIV: while(!(opstack.empty()) && (topop= opstack.top())!=OPAREN && topop>= MULTI) { Binaryop(opstack.top(),datastack); opstack.pop(); } opstack.push(nextop);break; case CPAREN: while(!(opstack.empty()) && (topop = opstack.top())!=OPAREN) { Binaryop(topop,datastack); opstack.pop(); } opstack.pop();break; default: break; } } while(!opstack.empty()) { Binaryop(opstack.top(),datastack); opstack.pop(); } return datastack.top(); } char data[101000]; int main(){ scanf("%s",data); calc tmp(data); cout<<tmp.result(); getchar(); getchar(); return 0; }