2012-12-19 2 views
0

중침 표기법을 후위 공 표식 (RPN)으로 변환하려고했습니다. 여기 중위에서 rpn 표현식을 작성하십시오.

String createRPN(String infix) 
{ 
    Stack *stack = node_alloc(1); //stack pointer 
    stack->next = NULL; 
    String ptr; //index 
    String RPN = malloc(strlen(infix) + 1); 
    String start = RPN; 

    for (ptr = infix; *ptr != '\0'; ptr++) 
    { 
     if (isNum(*ptr) || (*ptr == ' ')) *RPN++ = *ptr; 
     else if (*ptr == '(') push(&stack, '('); 
     else if (isOper(*ptr)) 
     { 
       while ((stack != NULL) && (stack->value != '(')) 
       { 
        if (compareOper(stack->value, *ptr)) *RPN++ = pop(&stack); 
        else break; 
       } 
       push(&stack, *ptr); 
     } 
     else if (*ptr == ')') 
     { 
       while ((stack != NULL) && (stack->value != '(')) *RPN++ = pop(&stack); 
       if (stack != NULL) pop(&stack); 
     } 
     else; 
    } 
    while (stack != NULL) *RPN++ = pop(&stack); 
    *RPN = '\0'; 

    return start; 
} 

스택 코드 :

typedef struct node 
{ 
    int value; 
    struct node *next; 
}Stack; 

void push(Stack **node, int value) 
{ 
    Stack *temp = node_alloc(1); 
    if (temp == NULL) return; 
    temp->value = value; 
    temp->next = *node; 
    *node = temp; 
} 

int pop(Stack **node) 
{ 
    if (*node == NULL) return 0; 

    int num = (*node)->value; 
    Stack *temp = (*node)->next; 
    free(*node); 
    *node = (temp == NULL) ? NULL : temp; 

    return num; 
} 

하지만 난 예 중위 문자열을 입력 한 후 :

2 * ((3 + 5) + (6 + 2) * 5) 

프로그램 충돌, 당신의 필요 여기 는 기능입니다 내 실수를 감지하는 데 도움이됩니다 ..

답변

0

String RPN = malloc(sizeof(char*) * strlen(infix)); 

은 모두 잘못되었습니다.

일반 문자로 생각할 때 sizeof (char *) (문자로의 포인터) 단위를 할당하고 있습니다. 또한 종료 문자를 허용하지 않습니다.

당신이 필요합니다

String RPN = malloc(strlen(infix) + 1); 

이이 1.

+0

들으 보장 이후 (적), sizeof (char) 곱 아무 소용이 없다,하지만 여전히 일을 해달라고, 그리고 문자열의 크기 (중온 표현식은 "()"을 가지고 후위 문자보다 크기가 더 크고 후위에 포함되어 있지 않습니다.) .. 그러나 실제 문제는 내가 알아 낸 실제 스크립트가 createRPN에서 문자열을 반환하지 않았기 때문에 변경되었지만 여전히 프로그램이 충돌합니다. .. – PieThon

관련 문제