Untitled
unknown
c_cpp
2 years ago
2.0 kB
6
Indexable
#include <stdio.h> #include <string.h> #include <assert.h> #include <stdbool.h> typedef struct S { char num[1000]; bool add, sub, mul, div; } S; bool isoper(S s) { return s.num[0] == '\0'; } S get(char c) { S s; s.num[0] = '\0'; s.add = s.sub = s.mul = s.div = false; if(c == '+' || c == '-' || c == '*' || c == '/') { if(c == '+') { s.add = true; } else if(c == '-') { s.sub = true; } else if(c == '*') { s.mul = true; } else { s.div = true; } } else { s.num[0] = c; s.num[1] = '\0'; } return s; } S addBracket(S s) { int n = strlen(s.num); if(n == 1) { return s; } for(int i = n; i > 0; --i) { s.num[i] = s.num[i - 1]; } s.num[0] = '('; s.num[n + 1] = ')'; s.num[n + 2] = '\0'; s.add = s.sub = s.mul = s.div = false; return s; } int n; char s[1000]; S stk[1000]; int sz = 0; int main() { scanf("%s", s); n = strlen(s); for(int i = 0; i < n; ++i) { stk[sz++] = get(s[i]); while(sz >= 3 && !isoper(stk[sz - 1]) && !isoper(stk[sz - 2])) { S B = stk[--sz]; S A = stk[--sz]; S tmp = stk[--sz]; assert(tmp.add + tmp.sub + tmp.mul + tmp.div == 1); char op; if(tmp.add) { op = '+'; } else if(tmp.sub) { op = '-'; } else if(tmp.mul) { op = '*'; } else { op = '/'; } S res; if(op == '-') { if(B.add || B.sub) { B = addBracket(B); } } else if(op == '/') { B = addBracket(B); if(A.add || A.sub) { A = addBracket(A); } } else if(op == '*') { if(A.add || A.sub) { A = addBracket(A); } if(B.add || B.sub) { B = addBracket(B); } } sprintf(res.num, "%s%c%s", A.num, op, B.num); res.add = A.add || B.add || op == '+'; res.sub = A.sub || B.sub || op == '-'; res.mul = A.mul || B.mul || op == '*'; res.div = A.div || B.div || op == '/'; stk[sz++] = res; } } assert(sz == 1); puts(stk[0].num); return 0; }
Editor is loading...