fork(28) download
  1. #include <iostream>
  2. #include <cctype>
  3.  
  4. using namespace std;
  5.  
  6. bool eval_expr(const char **pe, int &lhs, bool inside = false);
  7. char skip_ws(const char **pe) {
  8. while (**pe == ' ') ++(*pe);
  9. return **pe;
  10. }
  11. bool eval_prim(const char **pe, int &res) {
  12. char c = skip_ws(pe);
  13. if (c == '(') {
  14. ++(*pe);
  15. if (!eval_expr(pe, res, true)) return false;
  16. ++(*pe);
  17. return true;
  18. }
  19. if (isdigit(c)) {
  20. res = 0;
  21. while (isdigit(c)) {
  22. res = 10*res + c - '0';
  23. c = *(++(*pe));
  24. }
  25. return true;
  26. }
  27. return false;
  28. }
  29. bool eval_expr(const char **pe, int &lhs, bool inside) {
  30. if (!eval_prim(pe, lhs)) return false;
  31. char op;
  32. while ((op = skip_ws(pe)) && (op == '+' || op == '-' || op == '*' || op == '/')) {
  33. ++(*pe);
  34. int rhs;
  35. if (!eval_prim(pe, rhs)) return false;
  36. switch (op) {
  37. case '+': lhs += rhs; break;
  38. case '-': lhs -= rhs; break;
  39. case '*': lhs *= rhs; break;
  40. case '/': lhs /= rhs; break;
  41. }
  42. }
  43. return inside ? op == ')' : !op;
  44. }
  45.  
  46. bool evaluate(const char *e, int &result) {
  47. return eval_expr(&e, result);
  48. }
  49.  
  50. int main() {
  51. int res;
  52. if (evaluate("2", res)) {
  53. cout << res << endl;
  54. } else {
  55. cout << "invalid" << endl;
  56. }
  57. if (evaluate("2+3", res)) {
  58. cout << res << endl;
  59. } else {
  60. cout << "invalid" << endl;
  61. }
  62. if (evaluate("2*3-4", res)) {
  63. cout << res << endl;
  64. } else {
  65. cout << "invalid" << endl;
  66. }
  67. if (evaluate("(1+2)+5", res)) {
  68. cout << res << endl;
  69. } else {
  70. cout << "invalid" << endl;
  71. }
  72. if (evaluate("", res)) {
  73. cout << res << endl;
  74. } else {
  75. cout << "invalid" << endl;
  76. }
  77. if (evaluate("2+", res)) {
  78. cout << res << endl;
  79. } else {
  80. cout << "invalid" << endl;
  81. }
  82. return 0;
  83. }
Success #stdin #stdout 0.01s 2724KB
stdin
Standard input is empty
stdout
2
5
2
8
invalid
invalid