2016-12-20 2 views
0

Моя программа в основном преобразует выражение infix в постфиксное выражение, хотя до сих пор моя программа только принимала одиночные цифры. Во всяком случае, когда я пытаюсь скомпилировать, сразу после ввода моего выражения infix, программа вылетает почти сразу. Мой код:Программа сбоев после ввода строки

#include <stdio.h> 
#include <ctype.h> 
#include <string.h> 
#include <stdlib.h> 
int priority(char x); // Determines priority of incoming operator. 
void push(char x); // Pushes element to stack. 
char pop(); // Pops element from stack. 

char stack[10]; 
int top = -1; 

int main() { 
char init[20]; 
printf("Enter an expression: "); 
fgets(init, 20, stdin); 
int x = 0, y, z = 0; 
static char result[20]; 
while (init[x++] != '\0') { 
    if (isalnum(init[x])) 
     result[z++] = init[x]; // Operand printed out immediately. 
    else if (init[x] == '(') 
     push(init[x]); // '(' character pushed. 
    else if (init[x] == ')') { 
     while ((y = pop()) != '(')// Popping elements from stack until reaching '(' 
      result[z++] = y; 
    } else if (init[x] == ' ') { 
     z++; 
    else { 
     while (priority(init[x]) <= priority(stack[top])) // If expression operator has higher precedence than stack operator, expression operator is pushed onto stack. Else stack operator is popped and printed out. 
      result[z++] = pop(); 
     push(init[x]); 
    } 
} 
while (top != -1) 
    result[z++] = pop(); // Remaining operators printed out. 
printf("Final expression is %s.\n", result); 
} 
int priority(char x) { 
    int precedence = 0; 
    if(x == '(') 
     precedence = 0; 
    if(x == '+' || x == '-') 
     precedence = 1; 
    if(x == '*' || x == '/') 
     precedence = 2; 
    if(x == '^') 
     precedence = 3; 
    return precedence; 
} 

void push(char x) { 
stack[++top] = x; 
} 

char pop() { 
return stack[top--]; 
} 

У меня был вариант этого, который работал, но когда я смотрю на эту версию, ничего не кажется, будет отличаться. Может кто-нибудь, пожалуйста, скажите мне, что мне не хватает?

+2

Ваш первый цикл (над 'init') содержит довольно плохую (я думаю) логическую ошибку, и вы можете в ней использовать терминатор строки невольно. Попробуйте вместо этого заменить его на 'for'. –

+0

Кроме того, ваш второй цикл, в который вы попадаете в 'result', также является ошибочным и будет использовать' stack [0] ', который не используется вашим стеком. Говоря о стеке, проверки переполнения стека нет. –

ответ

1

Основной вопрос, который я нашел:

while (init[x++] != '\0') В то время как вы увеличиваем значение х в условии проверки петли, вы снова попытаться получить к нему доступ в вызове функции:

isalnum(init[x])

первое число никогда не оценивается таким образом. Поэтому, если вы введете «5 + 2», будет оцениваться только «+2», что является недопустимым выражением инфикса.

+0

Моя последняя версия этой программы наверняка была сделана таким же образом, и ей удалось оценить. Только здесь моя программа отказывается пройти через ввод строки и создает новую строку, которая затем будет распечатана. Я некоторое время изучаю C, и это все еще меня смущает, поэтому это поможет, если будет правильное решение этой проблемы. –

+0

Если это так, отправьте свою предыдущую версию @AmirulUmar – Amita

Смежные вопросы