Инфикс для постфиксной нотации С++

Привет, стек. В настоящее время я пытаюсь написать конвертер 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 конвертеру, не стесняйтесь поделиться, потому что это будет очень большая помощь! Я ухожу от случайного алгоритма. что я нашел в гугле.


person Conor    schedule 08.07.2013    source источник
comment
Для начала cin >> infix будет читать только до первого пробела... вы, вероятно, захотите использовать getline(std::cin, infix). Итак, для вашего примера ввод "5 + 8" будет обработан только 5....   -  person Tony Delroy    schedule 08.07.2013


Ответы (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;

Остерегайтесь ошибок, так как я не смог проверить этот код самостоятельно.

person Miklos Aubert    schedule 08.07.2013