fork download
  1. #include <cctype>
  2. #include <cmath>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <sstream>
  7. #include <stack>
  8. #include <stdio.h>
  9.  
  10. using namespace std;
  11.  
  12. class DividedByZero : public exception {};
  13.  
  14. bool is_balanced(const string &parenthesis) // for checking parentheses
  15. {
  16. stack<char> store;
  17. char check;
  18. for (string::size_type i = 0; i < parenthesis.length(); ++i) {
  19. check = parenthesis[i];
  20. if (check == '(' || check == '{' || check == '[') { store.push(check); }
  21. if (!store.empty()) {
  22. if (check == ')') {
  23. if (store.top() == '(') {
  24. store.pop();
  25. continue;
  26. } else {
  27. break;
  28. }
  29. }
  30. if (check == '}') {
  31. if (store.top() == '{') {
  32. store.pop();
  33. continue;
  34. } else {
  35. break;
  36. }
  37. }
  38. if (check == ']') {
  39. if (store.top() == '[') {
  40. store.pop();
  41. continue;
  42. } else {
  43. break;
  44. }
  45. }
  46. } else
  47. break;
  48. }
  49. return (store.empty());
  50. }
  51.  
  52. double precedence(char op) // precedence rules of operators
  53. {
  54. if (op == '+' || op == '-')
  55. return 1;
  56. else if (op == '*' || op == '/')
  57. return 2;
  58. return 0;
  59. }
  60.  
  61. void parse_stack_top(stack<double> &operand, stack<char> &operation) // parse stack top
  62. {
  63. double number1, number2;
  64.  
  65. number2 = operand.top();
  66. operand.pop();
  67.  
  68. number1 = operand.top();
  69. operand.pop();
  70.  
  71. switch (operation.top()) {
  72. case '+': operand.push(number1 + number2); break;
  73.  
  74. case '-': operand.push(number1 - number2); break;
  75.  
  76. case '*': operand.push(number1 * number2); break;
  77.  
  78. case '/':
  79. if (number2 == 0) // if number2 = 0, can not devide by zero
  80. {
  81. cout << "\nError!: Divide by zero.";
  82. throw DividedByZero();
  83. } else
  84. operand.push(number1 / number2);
  85. }
  86. operation.pop();
  87. }
  88.  
  89. double evaluate_stack(const string &token) // evaluate expression
  90. {
  91. stack<double> operand;
  92. stack<char> operation;
  93.  
  94. for (string::size_type i = 0; i < token.size(); i++) {
  95. if (isdigit(token[i]) || token[i] == '.') // check for numberic, and double value
  96. {
  97. double val = 0;
  98. while (i < token.size() && isdigit(token[i])) // if element of number is larger than one
  99. {
  100. val = (val * 10) + (token[i] - '0');
  101. i++;
  102. }
  103. if (token[i] == '.') {
  104. double resp = 0;
  105. i++;
  106. int powTen = 10;
  107. while (i < token.size() && isdigit(token[i])) {
  108. resp = resp + double(token[i] - '0') / powTen;
  109. powTen *= 10;
  110. i++;
  111. }
  112. val += resp;
  113. }
  114. if (!isdigit(token[i])) i--;
  115. operand.push(val);
  116. } else if (token[i] == '+' || token[i] == '-' || token[i] == '*' || token[i] == '/') {
  117. while (!operation.empty() && precedence(token[i]) < precedence(operation.top())) {
  118. parse_stack_top(operand, operation);
  119. }
  120. operation.push(token[i]);
  121. } else if (token[i] == '(' || token[i] == '{' || token[i] == '[') {
  122. operation.push('(');
  123. }
  124.  
  125. else if (token[i] == ')' || token[i] == '}' || token[i] == ']') {
  126. while (!operation.empty() && operation.top() != '(') {
  127. parse_stack_top(operand, operation);
  128. }
  129. operation.pop();
  130. }
  131. }
  132. while (!operation.empty()) { parse_stack_top(operand, operation); }
  133. return operand.top();
  134. }
  135.  
  136. int main(int argc, char **argv) {
  137.  
  138. string token;
  139.  
  140. cout << "\nYour Expression: ";
  141. getline(cin, token);
  142.  
  143. if (is_balanced(token)) {
  144. cout << "\nResult: " << evaluate_stack(token);
  145.  
  146. } else
  147. cout << "\nError!: parentheses is not balanced!";
  148.  
  149.  
  150. return 0;
  151. }
Success #stdin #stdout 0s 4248KB
stdin
{10.1+8.4*4.8}/2.2
stdout
Your Expression: 
Result: 22.9182