2013-07-08 68 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; 

注意错误,因为我无法自己测试此代码。