2016-04-21 3 views
0

Ниже я пытаюсь написать программу, которая оценивает постфиксные выражения. Тем не менее, я заметил, что два элемента, которые я настраиваю для работы, не устанавливаются в правильные значения. Я все еще изучаю функцию стека в библиотеке C++, поэтому, если кто-нибудь сможет объяснить, почему это происходит, я бы очень признателен!Оценка функции PostFix

/*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

Можете ли вы привести убедительный пример? Например, я нажимаю 3, но он появляется 42. – ChiefTwoPencils

+0

Я думаю, что здесь проблема. Я нажимаю эти элементы в стеке, но элементы, которые я нажимаю на стек, не являются элементами, которые выталкиваются. Так, например, я нажимаю 3 и 4. Затем программа видит оператор «+» и решает выскочить два верхних элемента, которые должны быть 3 и 4, но они выходят из случайных чисел, таких как 52 и 51. I я не уверен, почему он это делает –

ответ

0

Проблема ваша постфикс является строкой, и когда вы нажимаете эти символы (которые являются целыми числами), вы получите значение ascii назад (например, 51, 52). Они соответствуют правильным номерам (например, 3, 4)

В результате вы получаете значение, которое смещено на 48, что соответствует символу 0.

+0

Я все еще узнаю о значениях ascii, и я еще не понял, как они работают. Как мне разместить это? –

+0

Простое решение, так как вы знаете смещение, если 48, вычитаете 48 из того, что возвращается из стека, или до того, как вы нажмете его .51 - 48 = 3 и 52 - 48 = 4 и т. Д. @ChynnaHernandez – ChiefTwoPencils

+0

Благодарим вас за разъяснения –

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