2016-04-21 77 views
0

下面我试图编写一个评估后缀表达式的程序。但是,我注意到,我设置的两个要素未被设置为正确的值。我仍然在学习C++库中的堆栈特性,所以如果有人能解释为什么会发生这种情况,我将不胜感激!评价后缀函数

/*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等随机数。我不知道它为什么这样做 –

回答

0

的问题是你的后缀是一个字符串,当你把这些字符(这是有效的整数),你得到的ascii值回(例如51,52)。那些对应于正确的数字(例如3,4)

你最终得到的是一个偏移48的值,它对应于0符号。

+0

我仍然在学习ascii值,我还没有完全理解它们是如何工作的。我如何适应这个? –

+0

一个简单的解决方案,因为如果48知道偏移量,则从堆栈返回的内容中或在您推入它之前将其减去48 .. 51 - 48 = 3和52 - 48 = 4,依此类推。 @ChynnaHernandez – ChiefTwoPencils

+0

谢谢您的解释 –