2013-07-08 52 views
0

你好我正在試圖寫一個RPN轉換器,我是C++的新手。但我遇到了問題。希望我能詳細解釋這些問題。我使用數組來堆疊我的操作符。現在讓我們使用例如「5 + 8」當我坐下來:插入Postfix記法C++

else if(infix[i] == '+' or infix[i] == '-' or infix[i] == '*' or infix[i] == '/' or infix[i] == '^'){ 
       while(isp(stack1.top()) >= icp(infix[i])){ 
        postfix += stack1.pop(); 
       } 
       if(isp(stack1.top()) < icp(infix[i])){ 
        stack1.push(infix[i]);  
       } 

出於某種原因,將運營商推到堆棧,但隨後它不會操作添加到即時通訊加入我的元素後綴串變量太。出來就像「5 8」我看着我的流行功能,這似乎是正確的,但即時通訊難倒。如果你能帶領我走向正確的方向,那就太好了。

這是我的全碼:

#include <iostream> 
#include <string> 
#define DEFAULT_SIZE 100 

using namespace std; 

class Stack{ 

private: 
    char *array; 
    int tos, capacity; 

public: 
    //constructors 
    Stack(); 

    //Destructor 
    ~Stack(); 

    //Methods 
    void push(char a); 
    char pop(); 
    char top(); 
    int get_size(); 
    bool is_empty(); 
    bool is_full(); 
    void display();  

}; 

Stack::Stack(){ 
    array = new char[DEFAULT_SIZE]; 
    tos = 0; 
    capacity = DEFAULT_SIZE; 
} 

Stack::~Stack(){ 
    delete[] array; 
} 

void Stack::push(char a){ 
    if(!is_full()) 
     array[tos++] = a; 
} 

char Stack::pop(){ 
     return array[--tos]; 
} 

char Stack::top(){ 
    return array[tos]; 
} 

int Stack::get_size(){ 
    return tos; 
} 

bool Stack::is_empty(){ 
    if(tos == 0) 
     return true; 
    else 
     return false; 
} 

bool Stack::is_full(){ 
    if(tos == capacity) 
     return true; 
    else 
     return false; 
} 

void Stack::display(){ 
    if (tos == 0) 
     cout<<"The stack is empty"<<endl; 
    else{ 
     for (int i=0; i<tos;i++) 
       cout<<array[i]<<" "; 
     cout<<endl;   
    } 
} 

int isp(char a){ 
    if(a == '^'){ 
     return 3; 
    } 
    else if (a == '*' or a == '/'){ 
     return 2; 
    } 
    else if(a == '+' or a == '-'){ 
     return 1; 
    } 
    else if(a == '('){ 
     return 0; 
    } 
    else 
     return -1; 
} 

int icp(char a){ 
    if(a == '^'){ 
     return 4; 
    } 
    else if (a == '*' or a == '/'){ 
     return 2; 
    } 
    else if(a == '+' or a == '-'){ 
     return 1; 
    } 
    else if(a == '('){ 
     return 4; 
    } 
} 



int main(){ 
    string infix, postfix; 
    Stack stack1; 

    cout << "This is a Infix to Postfix Expression converter." << endl; 
    cout << "Enter your Infix Expression: "; 
    cin >> infix; 
    stack1.push('#'); 

    for(int i=0;i<infix.length();i++){ 
     if(isdigit(infix[i]) or isalpha(infix[i])){ 
      postfix += infix[i]; 
     } 
     else if(infix[i] == '+' or infix[i] == '-' or infix[i] == '*' or infix[i] == '/' or infix[i] == '^'){ 
      while(isp(stack1.top()) >= icp(infix[i])){ 
       postfix += stack1.pop(); 
      } 
      if(isp(stack1.top()) < icp(infix[i])){ 
       stack1.push(infix[i]);  
      } 
     } 
    } 
    cout << postfix; 


    return 0; 
} 

另外,如果你知道C++ RPN轉換器隨時分享,因爲這將是一個非常大的幫助anygood資源的網站!我要去隨機算法。我在谷歌上找到的。

+0

一開始'cin >> infix'只會讀到第一個空格......你可能想用'getline(std :: cin,infix)'。因此,對於你的示例輸入'「5 + 8」',只有'5'將被處理.... –

回答

1

用你的例子,你只是推動棧上的「+」號,但你永遠不會彈出它,因爲在處理符號「8」後,你已經離開了for循環。我認爲你需要另一個while循環來清空你的堆棧。

for(int i=0;i<infix.length();i++){ 
    if(isdigit(infix[i]) or isalpha(infix[i])){ 
     postfix += infix[i]; 
    } 
    else if(infix[i] == '+' or infix[i] == '-' or infix[i] == '*' or infix[i] == '/' or infix[i] == '^'){ 
     while(isp(stack1.top()) >= icp(infix[i])){ 
      postfix += stack1.pop(); 
     } 
     if(isp(stack1.top()) < icp(infix[i])){ 
      stack1.push(infix[i]);  
     } 
    } 
} 

// Fetch the remaining operators from the stack 
while(!stack1.is_empty()){ 
    postfix += stack1.pop(); 
} 

cout << postfix; 

注意錯誤,因爲我無法自己測試此代碼。