2011-10-11 69 views
0

我想了解這段代碼。它幹什麼它後綴表達式評估。我在理解代碼時遇到問題。如果有人能幫助我,我將非常感激。瞭解後綴表達式評估代碼

#include <iostream> 
#include <cstring> 
#include <stack> 
using namespace std; 
int main() 
{ 


    //suppose a contains the string.. 
    //n is the length of string... 
    char a[10]="A+B/C"; 
    int n = strlen(a) 
    stack<int>s; 
    for (int i=0;i<n;i++) 
    { 
     if (a[i]=='+') 
     { 
      s.push(s.pop()+s.pop()); 
      int temp1 = s.top(); 
      s.pop(); 
      int temp2 = s.top(); 
      s.pop(); 
      s.push(temp1 * temp2); 
     } 
     if (a[i]=='*') 
      s.push(s.pop() * s.pop()); 

     if ((a[i]>='0') && (a[i]<='9')) 
      s.push(0); 
     while ((a[i]>='0') && (a[i]<='9')) 
      s.push(10*s.pop()+(a[i++]-'0')); 
    } 

    cout<<s.pop()<<endl; 

    return 0; 
} 

在此先感謝。

+1

你寫過'a'的例子嗎?因爲它不是後綴。 –

+0

什麼問題? – AJG85

+0

stack :: pop()是一個void函數。 這段代碼亂七八糟。只需在SO上搜索後綴計算器,您就會發現這個 – sehe

回答

1

This site看起來是在這裏發生了什麼一個很好的資源,但表情應該使用數字,而不是字母。

說您有綴表達式1 + 2 * 3-4 * 5。相應的後綴將是123 * + 45 * - 。首先,您從左到右掃描字符串。前三個數字是操作數,因此它們將按照1(底部),2(中間),3(頂部)的順序存儲在堆棧中。接下來,有一個*運算符。爲了解決這個問題,將前兩個操作數從堆棧中彈出並將它們相乘(第一個操作數是右操作數,第二個是左邊)。這將計算爲2 * 3 = 6,和6將被存儲在棧上,使其成爲1,6

接着,有一個+運算符。 1和6被彈出並添加,7被存儲在堆棧上。在此之後,4和5也被推入堆疊(7,4,5)。下一個字符是另一個*運算符,因此它評估4 * 5 = 20並將20推入堆棧(7,20)。

最後,還有一個 - 操作符。 7和20彈出並評估爲7-20 =( - 13)。這被推入堆棧並準備好作爲最終答案彈出。

希望幫助澄清任何疑惑(假設我正確地讀你的問題)。