/*------------------------------------------------------------------------------ * problem006.cc: RPN Calculator **----------------------------------------------------------------------------*/ /* Copyright (c) 2009 Peter Bui. All Rights Reserved. * * Peter Bui * **------------------------------------------------------------------------------ * Includes **----------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include using namespace std; /*------------------------------------------------------------------------------ * Type Definitions **----------------------------------------------------------------------------*/ typedef list RPNList; typedef stack RPNStack; typedef vector LEDVector; /*------------------------------------------------------------------------------ * Constants **----------------------------------------------------------------------------*/ #define NLEDROWS 3 #define NLEDCOLS 3 #define NLEDDIGITS 10 const char LED_DIGITS[NLEDDIGITS][NLEDROWS][NLEDCOLS + 1] = { { " _ ", "| |", "|_|", }, { " ", " |", " |", }, { " _ ", " _|", "|_ ", }, { " _ ", " _|", " _|", }, { " ", "|_|", " |", }, { " _ ", "|_ ", " _|", }, { " _ ", "|_ ", "|_|", }, { " _ ", " |", " |", }, { " _ ", "|_|", "|_|", }, { " _ ", "|_|", " _|", }, }; /*------------------------------------------------------------------------------ * Macros **----------------------------------------------------------------------------*/ #define TOP_AND_POP(s) (s).top(); (s).pop(); #define RPN_EVAL_OP(x) {\ op1 = TOP_AND_POP(rpn_stack);\ op2 = TOP_AND_POP(rpn_stack);\ rpn_stack.push(x);} /*------------------------------------------------------------------------------ * Function Prototypes **----------------------------------------------------------------------------*/ int rpn_evaluate(RPNList &); void print_led(int); /*------------------------------------------------------------------------------ * Functions **----------------------------------------------------------------------------*/ int rpn_evaluate(RPNList &rpn_list) { RPNList::iterator token; RPNStack rpn_stack; int op1, op2, result; for (token = rpn_list.begin(); token != rpn_list.end(); token++) { if (*token == "+") RPN_EVAL_OP(op2 + op1) else if (*token == "-") RPN_EVAL_OP(op2 - op1) else if (*token == "*") RPN_EVAL_OP(op2 * op1) else if (*token == "/") RPN_EVAL_OP(op2 / op1) else if (*token == "^") RPN_EVAL_OP(pow(op2, op1)) else rpn_stack.push(atoi((*token).c_str())); } return (rpn_stack.top()); } void print_led(int number) { LEDVector led_vector(NLEDROWS, ""); stringstream ss; ss << number; for (size_t i = 0; i < ss.str().size(); i++) for (size_t r = 0; r < NLEDROWS; r++) led_vector[r] += LED_DIGITS[ss.str()[i] - '0'][r]; for (size_t i = 0; i < led_vector.size(); i++) cout << led_vector[i] << endl; } /*------------------------------------------------------------------------------ * Main Execution **----------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { RPNList rpn_list; string line, token; stringstream ss; while (!getline(cin, line).eof()) { ss.str(line); while (ss >> token) rpn_list.push_back(token); print_led(rpn_evaluate(rpn_list)); ss.clear(); rpn_list.clear(); } return (EXIT_SUCCESS); } /*------------------------------------------------------------------------------ * vim: sts=4 sw=4 ts=8 ft=cpp **----------------------------------------------------------------------------*/