1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <ctype.h>
#define is_op(c) (((c) == '+') || ((c) == '-') || ((c) == '*') || ((c) == '/')) #define is_dig(c) (((c) >= '0') && ((c) <= '9')) #define max(a,b) ((a)>(b)?(a):(b))
typedef struct{ int is_valid; int val; int next_idx; } info;
int n; char s[1000005];
info eval_num(int start){ int ans = 0; while(is_dig(s[start]) && start < n){ ans = ans * 10 + (s[start] - '0'); start++; } return (info) {1, ans, start}; }
info solve(int start){ info l, r; char op; if(s[start] == '('){ start++; if(is_dig(s[start])){ l = eval_num(start); op = s[l.next_idx]; if(!is_dig(s[l.next_idx + 1])) return (info) {0, 0, 0}; r = eval_num(l.next_idx + 1); } else if(s[start] == '('){ l = solve(start); op = s[l.next_idx]; if(s[l.next_idx + 1] != '(') return (info) {0, 0, 0}; r = solve(l.next_idx + 1); } } else{ return (info) {0, 0, 0}; }
if((!l.is_valid) || (!r.is_valid) || (!is_op(op)) || (s[r.next_idx]) != ')'){ return (info) {0, 0, 0}; }
if(op == '+') return (info) {1, l.val + r.val, r.next_idx + 1}; if(op == '-') return (info) {1, l.val - r.val, r.next_idx + 1}; if(op == '*') return (info) {1, l.val * r.val, r.next_idx + 1}; if(op == '/') return (info) {1, l.val / r.val, r.next_idx + 1}; }
int main(){ while(scanf("%s", s) != EOF){ n = strlen(s); info rtv = solve(0); if(rtv.is_valid == 1 && rtv.next_idx == n) printf("%d\n", rtv.val); else printf("invalid\n"); } }
|