/* * expr.cpp * * Created on: 24.10.2013 * Author: trifon */ #include "lstack.cpp" #include "sstack.cpp" #include using namespace std; typedef LStack CharStack; typedef LStack IntStack; const int MAXC = 400; int priority(char op) { switch(op) { case '+': case '-':return 1; case '*': case '/':return 2; case '(':return 0; } return -1; } void apply_operation(IntStack& is, char op) { int l,r; is.pop(r); is.pop(l); switch (op) { case '+':is.push(l + r);break; case '-':is.push(l - r);break; case '*':is.push(l * r);break; case '/':is.push(l / r); } } void calculate_rpn(char const* expr, char* result) { CharStack cs; char op; while(*expr != '\0') { if (*expr >= '0' && *expr <= '9') { // копираме директно *result++ = *expr; } if (*expr == '(') { // запазваме в стека cs.push(*expr); } if (*expr == '+' || *expr == '-' || *expr == '*' || *expr == '/') { /// !!! не трябва да позволяваме да поставим /// операция с нисък приоритет над операция с висок while (cs.top(op) && priority(op) > priority(*expr)) { cs.pop(op); *result++ = op; } cs.push(*expr); } if (*expr == ')') { while (cs.top(op) && op != '(') { cs.pop(op); *result++ = op; } // изваждаме и ( cs.pop(op); } expr++; } while (cs.pop(op)) *result++ = op; *result = '\0'; } int calculate(char const* rpn) { IntStack is; while (*rpn != '\0') { if (*rpn >= '0' && *rpn <= '9') is.push(*rpn-'0'); else { apply_operation(is, *rpn); } rpn++; } int result; is.pop(result); return result; } int calculate_direct(char const* expr) { CharStack cs; IntStack is; char op; while(*expr != '\0') { if (*expr >= '0' && *expr <= '9') { // копираме директно is.push(*expr-'0'); } if (*expr == '(') { // запазваме в стека cs.push(*expr); } if (*expr == '+' || *expr == '-' || *expr == '*' || *expr == '/') { /// !!! не трябва да позволяваме да поставим /// операция с нисък приоритет над операция с висок while (cs.top(op) && priority(op) > priority(*expr)) { cs.pop(op); apply_operation(is, op); } cs.push(*expr); } if (*expr == ')') { while (cs.top(op) && op != '(') { cs.pop(op); apply_operation(is, op); } // изваждаме и ( cs.pop(op); } expr++; } while (cs.pop(op)) apply_operation(is, op); int result; is.pop(result); return result; } int main() { char expr[MAXC]; cin.getline(expr, MAXC); char rpn[MAXC] = ""; calculate_rpn(expr, rpn); cout << rpn << endl; cout << calculate(rpn) << endl; cout << calculate_direct(expr) << endl; return 0; }