2016-04-21 12 views
0

Im Folgenden versuche ich ein Programm zu schreiben, das Postfix-Ausdrücke auswertet. Mir ist jedoch aufgefallen, dass die beiden Elemente, die ich einstellen möchte, nicht auf die richtigen Werte eingestellt sind. Ich lerne immer noch die Stack-Funktion in der C++ - Bibliothek, also wenn jemand erklären könnte, warum das passiert, würde ich es sehr schätzen!PostFix-Funktion auswerten

/*Sample output: 
Enter an infix or prefix expression:3+4-1 
Postfix is: 34+1- 
postFix[i]: 3 
postFix[i]: 4 
element1: 52 
element2: 51 
val is: 103 
postFix[i]: 1 
element1: 49 
element2: 103 
val is: 54 
Value is 54*/ 

int evaluatePostfix (string postFix) 
{ 
    stack<int> operands; 

     int length = postFix.length(); 
     int val = 0; 
     for (int i = 0; i < length; i++) 
     { 
       //if the char is a digit push the digit onto the stack 
       if(isdigit(postFix[i])) 
       { 
         operands.push(postFix[i]); 
         cout << "postFix[i]: " << postFix[i] << endl; 
       } 
       else if (isOperator(postFix[i])) 
       { 
         // 
         //element 1 and element 2 will be the element on the top of the stack 
         // 
         int element1 = operands.top(); 
         cout << "element1: " << element1 << endl; 
         operands.pop(); 
         int element2 = operands.top(); 
         cout << "element2: " << element2 << endl; 
         operands.pop(); 
         // 
         //create a switch statement that evaluates the elements based on the operator 
         // 
         switch(postFix[i]) 
         { 
           case '+': 
             val = element2 + element1; 
             cout << "val is: " << val << endl; 
             operands.push(val); 
             break; 
           case '-': 
             val = element2 - element1; 
             cout << "val is: " << val << endl; 
             operands.push(val); 
             break; 
           case '*': 
             val = element2 * element1; 
             operands.push(val); 
             break; 
           case '/': 
             val = element2/element1; 
             operands.push(val); 
             break; 
           default: 
             return 0; 
         } 

                       } 

     } 
     return val; 
} 
+0

Können Sie ein solides Beispiel geben? Zum Beispiel, ich drücke 3, aber es erscheint 42. – ChiefTwoPencils

+0

Ich denke, das ist das Problem hier. Ich schiebe diese Elemente auf den Stapel, aber die Elemente, die ich auf den Stapel schiebe, sind nicht die Elemente, die abgeknickt werden. Also, zum Beispiel, drücke ich 3 und 4. Dann sieht das Programm den Operator '+' und beschließt, die oberen zwei Elemente, die 3 und 4 sein sollten, herauszuspringen, aber es springt von Zufallszahlen wie 52 und 51 ab Ich bin mir nicht sicher, warum es das tut –

Antwort

0

Das Problem ist Ihre Postfix ein String ist und wenn Sie die Zeichen (die gültigen ganzen Zahlen) drücken Sie den ascii Wert zurück (zum Beispiel 51, 52). Diese entsprechen den korrekten Zahlen (z. B. 3, 4)

Was Sie am Ende haben, ist ein Wert, der um 48 versetzt ist, was dem Symbol 0 entspricht.

+0

Ich lerne immer noch über ASCII-Werte und ich habe nicht vollständig verstanden, wie sie gerade noch arbeiten. Wie passe ich das an? –

+0

Eine einfache Lösung, da Sie den Offset wissen, wenn 48, subtrahieren 48 von dem, was vom Stapel zurückgegeben wird oder bevor Sie es drücken.51 - 48 = 3 und 52 - 48 = 4, und so weiter. @ChynnaHernandez – ChiefTwoPencils

+0

Vielen Dank für Ihre Erklärungen –