Моя программа в основном преобразует выражение 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--];
}
У меня был вариант этого, который работал, но когда я смотрю на эту версию, ничего не кажется, будет отличаться. Может кто-нибудь, пожалуйста, скажите мне, что мне не хватает?
Ваш первый цикл (над 'init') содержит довольно плохую (я думаю) логическую ошибку, и вы можете в ней использовать терминатор строки невольно. Попробуйте вместо этого заменить его на 'for'. –
Кроме того, ваш второй цикл, в который вы попадаете в 'result', также является ошибочным и будет использовать' stack [0] ', который не используется вашим стеком. Говоря о стеке, проверки переполнения стека нет. –