Untitled

 avatar
unknown
c_cpp
2 years ago
1.9 kB
2
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct __Node{
    char data;
    struct __Node *left, *right;
}Node;

int isLetter(char c){
    if(c >= 'A' && c <= 'Z') return 1;
    else if(c == '\0') return -1;// == NULL
    else return 0; //是加減乘除
}

char s[260];
int pos = 0;

void printNode(Node* head){
    if(head != NULL){
        int flag = 0;
        char l = '\0', r = '\0';
        if(head->left != NULL) l = head->left->data;
        if(head->right != NULL) r = head->right->data;
        if(isLetter(l) != isLetter(r)){
            if(isLetter(l) == 0 && l != head->data) flag = 1;
            if(isLetter(r) == 0 && r != head->data) flag = 2;
        }
        if(head->data == '/' || head->data == '*'){
            if(isLetter(l) == 0 && l != head->data) flag = 1;
            if(isLetter(r) == 0 && r != head->data) flag = 2;
            if(isLetter(r) == 0 && isLetter(l) == 0 && l != head->data && r != head->data) flag = 3;
        }
        if(head->left != NULL){
            if(flag == 1 || flag == 3) printf("(");
            printNode(head->left);
            if(flag == 1 || flag == 3) printf(")");
        }
        printf("%c", head->data);
        if(head->right != NULL){
            if(flag == 2 || flag == 3) printf("(");
            printNode(head->right);
            if(flag == 2 || flag == 3) printf(")");
        }
    }   
    return;
}

Node* prefix(){
    Node* nd = (Node*)malloc(sizeof(Node));
    nd->left = NULL, nd->right = NULL;
    nd->data = s[pos];
    if(pos < strlen(s)){
        if(nd->data < 'A' || nd->data > 'Z'){
            pos++;
            nd->left = prefix();
            pos++;
            nd->right = prefix();
        }
    }
    return nd;
}

int main(){

    scanf("%s", &s);
    Node* init = prefix();
    printNode(init);
    printf("\n");
}