2014-03-05 87 views
0

許多程序最有效&最簡單的解決方案需要以評估像表達式:表達式求值C++

輸入:(T(TF))--->輸出:假(T爲真,和F爲假)

OR

輸入((公元前2年)3)$ --->輸出:abcbcabcbcabcbc

換句話說,如何處理包含括號表達式?

我用來推動堆棧直到達到')'。 那麼,波普直到我到達「(」,等等。 但是這需要很長的執行時間和小喬代碼!

,如果我試圖把好@Henrik代碼來解決算術表達式,我結束了一個錯誤的答案提前

+0

使用圖書館,例如助推精神:http://www.boost.org/doc/libs/1_55_0/libs/spirit/doc/html/index.html –

+0

謝謝,我會搜索它來獲得這個想法,但它是在C++上工作嗎? 3.4.2? –

+0

嗯,反思也許它不是最好的東西推薦...這不是最容易開始使用 –

回答

2

#include <iostream> 
using namespace std; 
const char * expressionToParse = "(T(TT))"; 
char peek() 
{ 
    return *expressionToParse; 
} 

char get() 
{ 
    return *expressionToParse++; 
} 
bool expression(); 
bool number() 
{ 
    bool result = get() - '0'; 
//even if I remove -'0' 
    cout<<"number() result:"<<result<<endl; 
    while (peek() == 'T' || peek() == 'F') 
    { 
     if (peek()=='T' && get()=='T') { 
      result=true; 
     } 
     else{ 
      result=false; 
     } 
    } 
    return result; 
} 
bool factor() 
{ 
    if (peek() == 'T' && peek() <= 'F') 
     return number(); 
    else if (peek() == '(') 
    { 
     get(); // '(' 
     bool result = expression(); 
     get(); // ')' 
     return result; 
    } 
    return 0; // error 
} 


bool expression() 
{ 
    bool result = factor(); 
    return result; 
} 

int main() 
{ 

    bool result = expression(); 
    if(result){ 
     cout<<"true"; 
    } 
    else{ 
     cout<<"false"; 
    } 

    return 0; 
} 

由於這是後綴形式的表現。評價一個後綴表達式最簡單的方法可以使用堆棧來完成的記錄。「後綴表達式求值」教程。

+0

嗯,我正在尋找中綴表達評估,如果我是正確的,它需要時間來轉換爲後綴然後評估,無論如何感謝你。 –

+0

'(a(b c 2)3)$' - >這確實是後綴,字符是操作數,數字是操作符。沒有必要進行轉換和評估後綴表達式是世界上最簡單的堆棧之一。 '(T(TF))' - >這對我來說是模棱兩可的,在這個表達式中我看不到任何運算符,所以我甚至不能確定這個表達式的類型。它對我來說是一個謎你怎麼得到'F'由於這個... – pasztorpisti

+0

謝謝你的解釋,並且對於(T(TF))我認爲操作符隱含(和)每兩個操作數 –