#include #include #include #include struct expr { char tip; struct expr *l, *r, *p; }; typedef struct expr expr; char s[300]; int len; expr e[10000]; int ne; expr *se[10000]; char so[300]; int son, sen; expr *root; expr* novi_expr (char tip, expr *left, expr *right) { e[ne].tip=tip; e[ne].l=left; e[ne].r=right; e[ne].p = NULL; ne++; return &e[ne-1]; } void makni_operaciju (void) { expr *el, *er; char op; er=se[--sen]; el=se[--sen]; op=so[--son]; se[sen++]=novi_expr(op, el, er); el->p = se[sen-1]; er->p = se[sen-1]; } void read_input(void) { scanf("%s", s+1); s[0] = '('; len = strlen(s); s[len] = ')'; s[len+1] = 0; len++; } int isoper (char c) { if (c=='+' || c=='-' || c=='*' || c=='/') return 1; return 0; } int ismult (char c) { if (c=='*' || c=='/') return 1; return 0; } void rem (expr *e) { expr *parent; parent=e->p; if (parent->l==e) { parent->l = e->l; if (e->l!=NULL) e->l->p = e->p; } else { parent->r = e->l; if (e->l!=NULL) e->l->p = e->p; } } void parse(void) { int i; expr *el; ne = sen = son = 0; for (i=0; i='a' && s[i]<='z') { se[sen++]=novi_expr(s[i], NULL, NULL); } else if (s[i]=='+' || s[i]=='-') { while (son>0 && isoper(so[son-1])) makni_operaciju(); so[son++]=s[i]; } else if (s[i]=='*' || s[i]=='/') { while (son>0 && ismult(so[son-1])) makni_operaciju(); so[son++]=s[i]; } else if (s[i]=='(') { so[son++]=s[i]; } else if (s[i]==')') { while (son>0 && isoper(so[son-1])) makni_operaciju(); son--; el = se[--sen]; se[sen++]=novi_expr('(', el, NULL); el->p = se[sen-1]; } } root=se[0]; } void sredi (expr *e) { if (e==NULL) return ; sredi(e->l); sredi(e->r); if (e->tip=='(') if (e->l->tip=='(' || ( e->l->tip>='a' && e->l->tip<='z')) { rem(e); return ; } } void popravi (expr *e) { if (e==NULL) return; popravi(e->l); popravi(e->r); if (e->tip!='(') return ; if (e->p->tip=='+') { rem(e); return ; } if (e->p->tip=='-') { if (e->l->tip=='*' || e->l->tip=='/') { rem(e); return ; } if (e->p->r==e) return ; rem(e); return ; } if (e->p->tip=='*') { if (e->l->tip=='+') return ; if (e->l->tip=='-') return ; rem(e); return ; } if (e->p->tip=='/'); { if (e->l->tip=='+') return ; if (e->l->tip=='-') return ; if (e->p->r==e) return ; rem(e); return ; } } void solve(void) { parse(); while (root->tip=='(') root=root->l; sredi(root); popravi(root); } void write_output(expr *e) { if (e==NULL) return ; if (e->tip=='(') { printf("("); write_output(e->l); printf(")"); return ; } if (e->tip>='a' && e->tip<='z') { printf("%c", e->tip); return ; } write_output(e->l); printf("%c", e->tip); write_output(e->r); } int main() { int z, zz; scanf("%d", &zz); for (z=0; z