Infix-prefix Konversion

Ich bin das schreiben von code zu konvertieren Infix-Ausdruck in Prefix.Ich habe ein problem mit meinem code , wenn ich die Eingabe dieser Ausdruck

x*y+((z*k)-(n/m))

Bin ich immer Antworten wie diese : +x*y**zk/nm

Habe ich verbringen viele Stunden hinter diesem Programm und noch ich kann nicht damit es funktioniert.

Die richtige Antwort ist : +*xy-*zk/nm

Antwort von Chaker

# include <stdio.h>
# include <string.h>
# define MAX 20
void infixtoprefix(char infix[20], char prefix[20]);
void reverse(char array[30]);
char pop();
void push(char symbol);
int isOperator(char symbol);
int prcd(char symbol);
int top = -1;
char stack[MAX];

main() {
char infix[20], prefix[20], temp;
printf("Enter infix operation: ");
gets(infix);
infixtoprefix(infix, prefix);
reverse(prefix);
puts((prefix));
}
//--------------------------------------------------------
void infixtoprefix(char infix[20], char prefix[20]) {
int i, j = 0;
char symbol;
stack[++top] = '#';
reverse(infix);
for (i = 0; i < strlen(infix); i++) {
symbol = infix[i];
if (isOperator(symbol) == 0) {
  prefix[j] = symbol;
  j++;
} else {
  if (symbol == ')') {
    push(symbol);
  } else if (symbol == '(') {
    while (stack[top] != ')') {
      prefix[j] = pop();
      j++;
    }
    pop();
  } else {
    if (prcd(stack[top]) <= prcd(symbol)) {
      push(symbol);
    } else {
      while (prcd(stack[top]) >= prcd(symbol)) {
        prefix[j] = pop();
        j++;
      }
      push(symbol);
    }
  //end for else
     }
   }
  //end for else
   }
  //end for for
  while (stack[top] != '#') {
    prefix[j] = pop();
    j++;
   }
  prefix[j] = '\0';
 }
 ////--------------------------------------------------------
 void reverse(char array[30]) {
 //for reverse of the given expression
 int i, j;
 char temp[100];
 for (i = strlen(array) - 1, j = 0; i + 1 != 0; --i, ++j) {
  temp[j] = array[i];
 }
 temp[j] = '\0';
 strcpy(array, temp);//copying temp array to array
  //return array;
 }
 //--------------------------------
  char pop() {
  char a;
  a = stack[top];
  top--;
  return a;
  }
 //----------------------------------
 void push(char symbol) {
 top++;
 stack[top] = symbol; 
 }
 //------------------------------------------
 int prcd(char symbol) {
 //returns the value that helps in the precedence
 switch (symbol) {
  case '+':
   case '-':
    return 2;
    break;
  case '*':
   case '/':
    return 4;
    break;
   case '$':
   case '^':
    return 6;
    break;
   case '#':
   case '(':
   case ')':
    return 1;
    break;
  } 
}
//-------------------------------------------------
int isOperator(char symbol) {
switch (symbol) {
case '+':
case '-':
case '*':
case '/':
case '^':
case '$':
case '&':
case '(':
case ')':
  return 1;
  break;
default:
  return 0;
 //returns 0 if the symbol is other than given above
  }
 }

Dieser code war die Antwort .

  • Meinst du postfix - notation?
  • Die Präfix-notation
  • "die Präfix-notation ist eine form der notation für die Logik, der Arithmetik und der algebra. Seine Besonderheit ist, dass es Orte Operatoren die linke Ihrer Operanden" (Wikipedia). Sie setzen die Betreiber auf die richtige der Operanden.
  • Ich bin der Konvertierung Infix-Ausdruck, z.B. a+b*c als Präfix .
  • also die "richtige Antwort", die Ihnen in Ihrer Frage ist eigentlich falsch (weil kein Präfix).
  • Vielen Dank für das finden der Fehler. Werde ich korrigieren es.
  • Hast du den debugger verwenden? Haltepunkte? Was schief geht, genau? Wo genau?
  • Ich habe Probleme mit der push Funktion..ich habe verbringen eine Menge Zeit auf der Suche nach dem genauen problem, aber ich konnte nicht .
  • Dies ist eine lange Funktion, mit vielen Fällen zu sehr langen Ausdrücken und so weiter. Was schief geht, exatly? In welchem Fall? Was sind die genauen Werte aller Variablen in diesem Fall? Was sind die erwarteten Werte? Schritt durch den code, überprüfen Sie jeden einzelnen Schritt, den es tut.
  • Wenn ein Betreiber schieben Sie es auf Stapel und liest die nächsten Zeichen.Den wenn das nächste Zeichen ist ein weiterer operator überprüfen Sie die Rangfolge, und drücken Sie den operator mit einer höheren Priorität auf das array und drücken Sie den operator mit niedriger Priorität, um die Präfix-array.Wenn das Zeichen gelesen wird,') ' pop-Operatoren in (), um die Präfix-array.
  • 1) len = strlen(stack); bei pop : stack ist nicht klar, die Inhalte sind gebracht pop.
  • Es ist tatsächlich zu finden, die Länge der stack-so wie man den Wert am stack[i] = ')' und dann pop die Betreiber bis '(' Klammern Präfix-array.
  • 2) stack[i] != '(' bei pop : Es ist falsch, davon auszugehen, dass es eine '(' (e.g input :x*y)
  • Hier bin ich schieben '(' auf den stack. else if(Zeichen == '(') { top++; stack[top] = '('; } Hier sind wir, vorausgesetzt, dass der Benutzer gibt den Ausdruck mit die gleiche Anzahl von öffnenden und schließenden Klammern .
  • if(character == '(') ? LOL
  • Diese Bedingung ist nicht notwendig, da am Ende der if-else-Anweisungen würde es automatisch bekommt, schob den Stapel.
  • Es ist tatsächlich zu finden, die Länge der stack-so wie man den Wert am stack[i] = ')'
  • "Ich habe Probleme mit der push-Funktion" -- um Himmels Willen, lernen zu denken wie ein Programmierer, wenn Sie Hilfe wollen. Was genau ist falsch gelaufen? Wenn Sie können nicht definieren, das problem, wie kann man Menschen helfen, Sie eine Lösung finden?

InformationsquelleAutor CodeIt | 2015-03-30
Schreibe einen Kommentar