2014-12-07 57 views
0

我想從中綴轉換爲後綴(我還有更多要做),但我甚至無法繼續工作,因爲我得到一個錯誤。任何人都可以幫我找出爲什麼我的後綴轉換不起作用嗎?

這裏就是錯誤在於:

//infix input is "1 + 2 * 3 - 4" 
//tokens = {"1", "+", "2", "*", "3", "-", "4") 
for(int i = 0; i < tokens.size(); i++) 
{ 
    if(isOperand(tokens[i])) 
     tempPostfix += tokens[i]; 
    else if(isOperator(tokens[i])) 
    { 
     if(st.empty()) 
      st.push(tokens[i]); 
     else if(getWeight(tokens[i]) > getWeight(st.top())) 
      st.push(tokens[i]); 
     else 
     { 
      while(getWeight(tokens[i]) <= getWeight(st.top()) && !st.empty()) 
      { 
       tempPostfix += st.top(); 
       st.pop(); //If there is only one item in the stack, it crashes 
      } 

      st.push(tokens[i]); 
     } 
    } 

} 
while(!st.empty()) 
{ 
    tempPostfix += st.top(); 
    st.pop(); 
} 
string postfix = tempPostfix; 
return postfix; 

這裏是我的,我在那裏

bool isOperator(string s) 
{ 
    bool r = false; 
    if(s == "+" || s == "-" || s == "*" || s == "/") 
     r = true; 

    return r; 
} 

bool isOperand(string s) 
{ 
    bool r = false; 
    if(!isOperator(s) && s != "(" && s != ")") 
     r = true; 

    return r; 
} 

int getWeight(string op) 
{ 
    int weight = 0; 
    if(op == "+" || op == "-") 
     weight = 1; 
    if(op == "*" || op == "/") 
     weight = 2; 

    return weight; 
} 

叫我可以計算出其餘一旦我弄清楚爲什麼我收到的其他功能錯誤在那裏。提前致謝。

+0

回覆:問題標籤:** 1。**請添加適當的編程語言標籤,例如: 'C++'。 ** 2。**你確定'postfix'標籤是正確的嗎? (來自標記的wiki:_「Postfix是一個免費的,開源的,廣泛使用的跨平臺郵件服務器,可在所有常見平臺上使用。」)__ – stakx 2014-12-07 20:23:56

回答

0

您應該更改while循環中的條件順序。正如你所說的那樣,當只剩下一個物品時,會出現錯誤。因此,在堆棧中的最後一項被彈出之後,while循環中的條件會再次被評估,並且在清除堆棧中沒有更多項目時嘗試執行st.top()操作。

爲了解決這個問題,你可以很容易地重新排列條件,以便把這個!st.empty()放在第一位。這樣就會出現短路,因此其餘條件不會被評估。

+0

太棒了,非常感謝。這個小東西是我的代碼中唯一的錯誤。 – 2014-12-07 20:42:23

相關問題