2016-09-08 39 views
-1

我想寫一個簡單的程序來將中綴表示法轉換爲前綴和後綴。到目前爲止,後綴一個完美的作品。但是,我似乎無法獲得前綴轉換權。我使用了分流碼算法。如果我的代碼有點不尋常(即編寫自己的堆棧類而不是使用#include,不必要地使用其他東西),我必須事先抱歉,我必須滿足分配要求(這是一項大學作業)。以下是我試過到目前爲止:C++中綴到前綴轉換?

#include<iostream> 
#include<string.h> 
using namespace std; 

const int Max=255; 
class Stack 
{ 
private: 
    char element[Max]; 
    int top; 
public: 
    Stack() 
    { 
     top=-1; 
    } 
    bool isFull() 
    { 
     if(top>=(Max-1)) return true; 
     else return false; 
    } 
    bool isEmpty() 
    { 
     if(top==-1) return true; 
     else return false; 
    } 
    bool push(char x) 
    { 
     if(!isFull()) 
     { 
      top++; 
      element[top]=x; 
      return true; 
     } 
     else 
     { 
      cout<<"Stack is full"<<endl; 
      return false; 
     } 
    } 
    bool pop(char &x) 
    { 
     if(!isEmpty()) 
     { 
      x=element[top--]; 
      return true; 
     } 
     else 
     { 
      //cout<<"Stack is empty"<<endl; 
      return false; 
     } 
    } 
    char retrieve() 
    { 
     if(!isEmpty()) 
     { 
      return element[top]; 
     } 
     else 
     { 
      //cout<<"Stack is empty"<<endl; 
      return ' '; 
     } 
    } 
}; 


class Converter 
{ 
private: 
public: 
    Converter(){} 
    bool isOperator(char x) 
    { 
     if(x=='+'||x=='-'||x=='*'||x=='/'||x=='^'||x=='('||x==')') return true; 
     else return false; 
    } 
    bool isOperand(char x) 
    { 
     if(x>='0'&&x<='9') return true; 
     else return false; 
    } 
    int Hierarchy(char x) 
    { 
     if(x=='+'||x=='-') return 1; 
     else if(x=='*'||x=='/') return 2; 
     else if(x=='^') return 3; 
     else return 0; 
    } 
    char*ToPostfix(char infix[]) 
    { 
     Stack stack1; 
     char res[20]; 
     int resindex=0; 
     for(int i=0;i<strlen(infix);i++) 
     { 
      if(isOperator(infix[i])) 
      { 
       if(infix[i]=='(') 
       { 
        stack1.push(infix[i]); 
       } 
       else if(infix[i]==')') 
       { 
        while(stack1.retrieve()!='(') 
        { 
         stack1.pop(res[resindex++]); 
        } 
        stack1.pop(res[resindex]); 
       } 
       else 
       { 
        while(Hierarchy(infix[i])<=Hierarchy(stack1.retrieve())) 
        { 
         stack1.pop(res[resindex++]); 
        } 
        stack1.push(infix[i]); 
       } 
      } 
      else if(isOperand(infix[i])) 
      { 
       res[resindex++]=infix[i]; 
      } 
     } 
     while(!stack1.isEmpty()) 
     { 
      stack1.pop(res[resindex++]); 
     } 
     res[resindex]='\0'; 
     return res; 
    } 
    char*ToPrefix(char infix[]) 
    { 
     char res[20]; 
     strcpy(res,strrev(infix)); 
     for(int i=0;i<strlen(res);i++) 
     { 
      if(res[i]=='(') 
      { 
       res[i]=')'; 
      } 
      else if(res[i]==')') 
      { 
       res[i]='('; 
      } 
     } 
     strcpy(res,ToPostfix(res)); 
     strcpy(res,strrev(res)); 
     return res; 
    } 
}; 
int main() 
{ 
    Converter convert; 
    char infix[20]; 
    cout<<"Enter infix expression: "; 
    cin>>infix; 
    cout<<endl<<"Prefix: "<<convert.ToPrefix(infix)<<endl; 
    cout<<"Postfix: "<<convert.ToPostfix(infix)<<endl; 
    return 0; 
} 

,當我嘗試轉換一個簡單的中綴表示法,即1 *(2 + 3)/ 4^5-6,後綴轉換是正確的(123 + * 45 ^/6-),但前綴轉換返回錯誤的答案( - * 1/+ 23^456)而不是 -/* 1 + 23^456。誰能幫忙?

+2

這聽起來像你可能需要學習如何使用調試器來遍歷你的代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

@NathanOliver我調試了這20多次在過去的2個小時裏,仍然沒有弄清楚前綴算法可能是錯誤的,我甚至沒有找到任何可以幫助的東西。我很抱歉,如果我聽起來很愚蠢,絕望,但我是。 – Penny

回答

1

實際上,兩個答案都是正確的,因爲如果乘法在中綴中最先出現,您可以切換除法和乘法的順序。所以你的錯誤答案在這種情況下是正確的。但是,存在從左到右的優先順序,因此您的層次結構處理不正確:更改else if(x=='*'||x=='/') return 2;

+0

不確定,但在再次查看代碼後,我想'while(Hierarchy(infix [i])<= Hierarchy(stack1.retrieve()))'while'(Hierarchy(infix [i])) stefaanv