fork(1) download
  1. #include<cctype>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<stack>
  6. using namespace std;
  7. double read_and_evaluate(istream& ins);
  8. void evaluate_stack_tops(stack<double>& numbers,stack<char>& operations);
  9. int main()
  10. {
  11. double answer;
  12. cout<<"Type a fully parenthesized arithmetic expression:"<<endl;
  13. answer= read_and_evaluate(cin);
  14. cout<<"That evaluates to"<<answer<<endl;
  15. return EXIT_SUCCESS;
  16. }
  17. double read_and_evaluate(istream& ins)
  18. {
  19. const char DECIMAL = '.';
  20. const char RIGHT_PARENTHESIS = ')';
  21. stack<double> numbers;
  22. stack<char> operations;
  23. double number;
  24. char symbol;
  25. while(ins&&ins.peek() != '\n')
  26. {
  27. if(isdigit(ins.peek())||(ins.peek()==DECIMAL))
  28. {
  29. ins>>number;
  30. numbers.push(number);
  31. }
  32. else if(strchr("+-*/",ins.peek())!=NULL)
  33. {
  34. ins>>symbol;
  35. operations.push(number);
  36. }
  37. else if(ins.peek()==RIGHT_PARENTHESIS)
  38. {
  39. ins.ignore();
  40. evaluate_stack_tops(numbers,operations);
  41. }
  42. else
  43. ins.ignore();
  44. }
  45. return numbers.top();
  46. }
  47. void evaluate_stack_tops(stack<double>& numbers, stack<char>& operations)
  48. {
  49. double operand1,operand2;
  50. operand2=numbers.top();
  51. numbers.pop();
  52. operand1=numbers.top();
  53. numbers.pop();
  54. switch(operations.top())
  55. {
  56. case '+': numbers.push(operand1+operand2);
  57. break;
  58. case '-': numbers.push(operand1-operand2);
  59. break;
  60. case '*': numbers.push(operand1*operand2);
  61. break;
  62. case '/': numbers.push(operand1/operand2);
  63. break;
  64. }
  65. operations.pop();
  66. }
Runtime error #stdin #stdout 0s 3240KB
stdin
Standard input is empty
stdout
Type a fully parenthesized arithmetic expression: