2012-12-10 38 views
0

我想將中綴轉換爲後綴表達式。這是我的代碼:使用堆棧中綴到後綴轉換器

問題是,這實際上不這樣做,我很困惑爲什麼。一切都對我有意義,但是當我輸入例如4*5作爲輸出我得到同樣的東西。 infix是一個輸入,後綴是我想返回作爲指向後綴的指針,因此可以進行評估。如果是

操作返回true * - +或/

UPDATE:

OKI我得到它的工作,但我有麻煩搞清楚什麼,如果你輸入像5 * 3 + -1.2那麼它不如果你想要像負數一樣工作。

void infix2postfix(char* infix, char* postfix){ 
    char *in,*post; 
     Stack<char>Q; 
     char n; 
     in = &infix[0]; 
     post = &postfix[0]; 
     while(*in){ 
      while(*in == ' ' || *in == '\t'){ 
       in++; 
      } 
      if(isdigit(*in) || isalpha(*in)){ 
       while(isdigit(*in) || isalpha(*in)){ 
        *post = *in; 
        post++; 
        in++; 
       } 
      } 
      if(*in == '('){ 
       Q.Push(*in); 
       in++; 
      } 
      if(*in == ')'){ 
       n = Q.Pop(); 
       while(n != '('){ 
        *post = n; 
        post++; 
        n = Q.Pop(); 
       } 
       in++; 
      } 
      if(operand(*in)){ 
       if(Q.IsEmpty()) 
        Q.Push(*in); 
       else{ 
        n = Q.Pop(); 
        while(priority(n) >= priority(*in)){ 
         *post = n; 
         post++; 
         n = Q.Pop(); 
        } 
        Q.Push(n); 
        Q.Push(*in); 
       } 
       in++; 
      } 
     } 
     while(!Q.IsEmpty()) 
     { 
      n = Q.Pop(); 
      *post = n; 
      post++; 

     } 
     *post = '\0'; 
    } 

這裏是我的代碼的新代碼,它的工作原理,但我希望它與一元運營商合作,因此將採取輸入4 * 5 + 4 + -1.2,所以之間的空間,如果沒有那麼它是例如-1.2負數。我的代碼也不適用於超過9的整數,如果我把10放在1 * 0上。 。

+0

試着調試你的代碼?在Visual Studio中,您可以按F10逐行執行您的代碼。 – atoMerz

+0

@AtoMerZ我嘗試過,但我沒有真正瞭解它。 –

+1

當我遇到這樣的問題時,我嘗試按照以前建議的方式逐行執行我的代碼。仔細觀察變量值和預期行爲。最終我找到了錯誤點。 – atoMerz

回答

0

如果可以使用兩個堆棧,則可以使用一個值作爲值,一個值作爲操作符。

當您從輸入中提取一個值時,將其推到值棧上,找到一個操作員將其推入操作堆棧時。

然後當創建輸出時,從操作堆棧中彈出一個操作符,從值堆棧中彈出一個或兩個(取決於操作符)值。輸出值,輸出操作員。對於使用多個運算符的表達式,以前的操作被認爲是第一個值,因此您下次只需要彈出一個(或零)值。

當然,這是一種天真的方式,並不處理運算符優先級等事情。

你也可以做一個遞歸下降解析器,儘管它實際上並沒有使用一個顯式堆棧,但在該函數中使用了一個隱式堆棧,因此被遞歸調用,所以堆棧實際上是函數調用堆棧。

+0

感謝這個問題,但我認爲有一些愚蠢的錯誤,我正在做,這就是爲什麼它的工作,也許我沒有保存它的權利或東西 –

+1

@JackF到首先,修復'for'循環!然後按照評論者的建議,使用調試器逐行檢查變量和條件。調試器是你的朋友,儘可能多地使用它。 –

+0

oki我得到它的工作,但我很難搞清楚如果你輸入像5 * 3 + -1.2那麼它不會工作,如果你想像負數。 –