Mein Programm konvertiert im Grunde einen Infix-Ausdruck in einen Postfix-Ausdruck, obwohl mein Programm bisher nur einzelne Ziffern akzeptiert. Jedenfalls stürzt das Programm sofort nach der Eingabe meines Infix-Ausdrucks ab, wenn ich versuche zu kompilieren. Mein Code:Programm stürzt nach String-Eingang ab
#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--];
}
hatte ich eine Version davon, die funktioniert, aber wenn ich bei dieser Version sehen, nichts scheint anders zu sein. Kann mir bitte jemand sagen, was ich vermisse?
Ihre erste Schleife (über 'init') enthält einen ziemlich schlechten (ich denke) logischen Fehler, und Sie können den String-Terminator unwissentlich verwenden. Versuchen Sie es stattdessen in eine "for" -Schleife zu ändern. –
Auch Ihre zweite Schleife, in die Sie 'result' eingeben, ist ebenfalls fehlerhaft und verwendet den' stack [0] ', den Ihr Stack nicht verwendet. Und wenn man über den Stack spricht, gibt es keinen Stack-Overflow-Check. –