C: Оценка выражения в очереди не работает

Я создал очередь, используя связанный список, который берет строку в формате 1 + 3 + 5 = или 1-3+2-4 = но следующий код, который должен выполнять расчет с учетом знака и выдавать ответ, не является например, если я передал строку, например, 66 - 31 - 21 + 43 = , ответ получился равным -47 вместо 57 . Может кто-то помочь мне решить это или указать на то, что я делаю неправильно.

 void printQueue(struct node* head) { struct node* temp; char *token, *del=" "; int total = 0; while (head != NULL) { token = strtok(head->data, del); while (token != NULL) { int a = strcmp(token, "+"); int b = strcmp(token, "-"); if (a == 0) { printf("+"); total = total + *token; } else if (b == 0) { printf("+"); total = total - *token; } printf("%s ", token); token = strtok(NULL, del); } printf(" %d\n",subtraction); head = head->next; } } 

Ваш код игнорирует числа, вместо этого добавляет коды символов '+' и '-' . Число -47 – результат вычисления -45-45 + 43: 45 – код символа для тире; 43 – код символа для плюса.

Чтобы правильно работать, внесите эти изменения в свой код:

  • Добавить переменную sign типа int с начальным значением 1
  • Когда вы увидите знак плюса, установите sign в 1
  • Когда вы видите знак минус, установите sign -1
  • Когда вы видите токен, который не является ни плюсом, ни минусом, преобразуйте его в int val (например, путем вызова atoi ) и добавьте val * sign в текущую сумму.

Это изменение заставит ваш код работать с допустимыми выражениями, но это не сработает для некоторых недопустимых. Например, для выражения « 1 2 3 », например 1 2 3 были бы « 1+2+3 и т. Д.

В вашем коде есть несколько странностей, вот несколько:

  1. Ваш внутренний цикл, который проверяет, имеет ли токен! = NULL, всегда имеет 1 итерацию, вероятно, это должно быть утверждение if
  2. Вы ищете только токены «+» и «-» и добавляете их значение символа к вашему итогу, а не к следующему номеру, вы игнорируете токены, которые удерживают цифры
  3. При вычитании вы по-прежнему печатаете «+» на экране
 #include  #include  #include  typedef struct node{ int value; struct node *next; } Node; typedef struct queque { Node *top; Node *tail; } Queque; Queque *Q_new(void){ return calloc(1, sizeof(Queque)); } void Q_enq(Queque *q, int value){ Node *node = calloc(1, sizeof(Node)); if(!node) exit((printf("failed Securing memory\n"),1)); node->value = value; q->tail = q->top ? (q->tail->next = node) : (q->top = node); } Node *Q_deq(Queque *q){ if(q->top){ Node *node = q->top; q->top = q->top->next; return node; } return NULL; } void Q_drop(Queque *q){ Node *node; while(node = Q_deq(q)) free(node); free(q); } void strToQ(const char *str, Queque *q){ char *p = (char*)str; int num; while(*p){ if(isspace(*p)){ ++p; continue; } else if(*p == '+' || *p == '-' || *p == '='){//not used to a number sign Q_enq(q, *p++); continue; } num = strtol(p, &p, 10); Q_enq(q, num); } } int Q_calc(Queque *q){ int total = 0; Node *node = Q_deq(q); if(!node) return 0; total = node->value; free(node); while(node = Q_deq(q)){ if(node->value == '='){ free(node); break; } else { int op = node->value; free(node); node = Q_deq(q);//NOT NULL(if NULL then invalid syntax) if(op == '+') total += node->value; else if(op == '-') total -= node->value; free(node); } } return total; } int main(){ Queque *q = Q_new(); strToQ("1 + 3 + 5 =", q); printf("%d\n", Q_calc(q));//9, q to be empty strToQ("1-3+2-4 =", q); printf("%d\n", Q_calc(q));//-4 strToQ("66 - 31 - 21 + 43 =", q); printf("%d\n", Q_calc(q));//57 Q_drop(q); } в #include  #include  #include  typedef struct node{ int value; struct node *next; } Node; typedef struct queque { Node *top; Node *tail; } Queque; Queque *Q_new(void){ return calloc(1, sizeof(Queque)); } void Q_enq(Queque *q, int value){ Node *node = calloc(1, sizeof(Node)); if(!node) exit((printf("failed Securing memory\n"),1)); node->value = value; q->tail = q->top ? (q->tail->next = node) : (q->top = node); } Node *Q_deq(Queque *q){ if(q->top){ Node *node = q->top; q->top = q->top->next; return node; } return NULL; } void Q_drop(Queque *q){ Node *node; while(node = Q_deq(q)) free(node); free(q); } void strToQ(const char *str, Queque *q){ char *p = (char*)str; int num; while(*p){ if(isspace(*p)){ ++p; continue; } else if(*p == '+' || *p == '-' || *p == '='){//not used to a number sign Q_enq(q, *p++); continue; } num = strtol(p, &p, 10); Q_enq(q, num); } } int Q_calc(Queque *q){ int total = 0; Node *node = Q_deq(q); if(!node) return 0; total = node->value; free(node); while(node = Q_deq(q)){ if(node->value == '='){ free(node); break; } else { int op = node->value; free(node); node = Q_deq(q);//NOT NULL(if NULL then invalid syntax) if(op == '+') total += node->value; else if(op == '-') total -= node->value; free(node); } } return total; } int main(){ Queque *q = Q_new(); strToQ("1 + 3 + 5 =", q); printf("%d\n", Q_calc(q));//9, q to be empty strToQ("1-3+2-4 =", q); printf("%d\n", Q_calc(q));//-4 strToQ("66 - 31 - 21 + 43 =", q); printf("%d\n", Q_calc(q));//57 Q_drop(q); }