0

你好 Stack 我目前正在尝试编写一个 RPN 转换器,而且我是 C++ 新手。但我遇到了问题。希望我能详细解释问题。我使用数组来堆叠我的运算符。让我们使用示例“5 + 8”当我开始:

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 转换器的好资源站点,请随时分享,因为这将是一个非常大的帮助!我要随机算法。我在谷歌上找到的。

4

1 回答 1

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;

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

于 2013-07-08T07:42:28.047 回答