Reverse Polish Calculator Implement a reverse polish notation calculator as described in class. It must be interactive, the user types an expression and the result is printed. That repeats until the user wants to stop. ctrl-D and ctrl-C should both stop the calculator. Results must be given with at least 12 digits of accuracy, but no more than the precision of a double can support. Thorough error detection is required. If there is anything that is (detectably) wrong with the formula or an improper calculation is demanded (such as, but not limited to, division by zero) the user must be told what is wrong, and no value for the expression may be displayed. Errors must not cause the calculator to stop working. The formulae consist of numbers (in the form of doubles), operators, named functions, one named constant (pi), variables and assignments. Do not attempt to do everything at once. Start simple, just numbers and a few operators at the beginning, and don't move forward until everything is fully working. Save variables and assignemnt until last. The parts of the expression will be space separated, numbers may be typed in any way that would be accepted as a double constant in C++. That includes optional + or -. Use strtod to convert from strings to doubles. The operators must include + * - / and ^ (^ stands for to-the-power-of). Provide at least 20 functions including sqrt, sin, cos, log, and exp. There is no need to create thos functions for yourself, you can use the #include. You must read a whole line of text from the user and extract the parts from it with an istringstream. The end of the input line is the end of the formula. #include to make the stack. Variable names should consist only of letters, and must be insensitive to case (radius, RADIUS, and raDiUs are the same variable). When a variable name appears just treat it as a number, pushing its value onto the stack. It is an error to use a variable that hasn't been given a value. Assignment operations require a slight variation on the reverse polish style: The symbol -> must always be followed by a variable name, and represents setting that variable's value to whatever is currently on the top of the stack. For variables, you must create a special memory object (or struct or class) which contains two equal-size vectors, one for names and one for values, and methods for all the operations necessary. There aren't many. Every feature must be properly tested, and your submissions must include those tests, all from one continuous run of your program. Example expressions and displayed results 3 4 5 + * 27 3 4 5 + * -> radius 27 (and now radius is 27) radius 2 ^ pi * 2290.2210446696 1 2 3 4 5 * * * * -> x 2 * 240 (and now x is 120) pi 0.25 * sin 0.70710678118655 2 4 5 1 - - / 3 + error - division by zero 6.254175 3.745824 + 9.999999 Your results do not have to exactly duplicate mine. These examples are only examples, they do not constitute adequate testing.