0

中置記法式を後置記法 (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)

プログラムがクラッシュします。私の間違いを見つけるためにあなたの助けが必要です..

4

1 に答える 1

0

これ:

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

すべて間違っています。

sizeof (char *)普通の文字で考える必要があるときに、(文字へのポインター)の単位を割り当てています。また、終了文字を許可していません。

必要なもの:

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

sizeof (char)1 になることが保証されているため、を (これまでに) 掛けても意味がありません。

于 2012-12-19T12:16:07.623 に答える