Преобразуване на израз с инфиксна нотация в постфиксна нотация

Правя задача за моя курс по структури от данни, където трябва да конвертирам инфиксен израз в постфиксен израз. Почти приключих с него, но продължавам да получавам грешка, когато се опитам да въведа нещо като a+b+c

Може да се справи добре с a+b и a+b*c.

Наистина не съм сигурен какво не е наред с него. Ако някой може да ме насочи в посока или да види проблема с моя код, ще съм много благодарен.

#include <iostream>
#include <stack>

using namespace std; 

//checks priority of operators.
int priority(char e){
    int pri = 0; 

    if(e == '*' || e == '/' || e == '%'){
        pri = 2; 
    }else{
        if(e == '+' || e == '-'){
            pri = 1; 
        }
    }
    return pri; 
}

void main(){
    cout << "This program will convert an infix expression to a postfix expression." << endl; 
    cout << "Please enter your expression without any spaces." << endl; 

    stack<char> charStack; 

    char input[100]; 
    char output[100];
    char n1; 

    char *o; 
    o = &output[0]; 

    cin >> input; 

    int n = 0; 
    while(input[n] != 0){

        if(isdigit(input[n])  || isalpha(input[n])){
            *o = input[n]; 
            n++; 
            o++; 
        }

        if(input[n] == '('){
            charStack.push(input[n]); 
            n++;
        }

        if(input[n] == ')'){
            n1 = charStack.top(); 
            charStack.pop(); 
            while(n1 != '('){
                *o = n1; 
                o++; 
                n1 = charStack.top(); 
                charStack.pop(); 
            }
            n++; 
        }

        if(input[n] == '+' || input[n] == '-' || input[n] == '*' || input[n] == '/' || input[n] == '%'){
            if(charStack.empty() == true){
                charStack.push(input[n]);
            }else{
                n1 = charStack.top(); 
                charStack.pop(); 
                while(priority(n1) >= priority(input[n])){
                    *o = n1; 
                    o++;
                    n1 = charStack.top(); 
                    charStack.pop(); 
                }
                charStack.push(n1); 
                charStack.push(input[n]); 
            }
            n++; 
        }
    }
    while(!charStack.empty()){
        *o = charStack.top(); 
        o++; 
        charStack.pop(); 
    }
    *o = '\0'; 

    cout << output << endl; 

}

person d2jxp    schedule 18.12.2010    source източник


Отговори (2)


Не проверявате дали стекът е празен, преди да извадите елемент в кода за оператори. Това е част от проблема.

Между другото, трябва да е int main() вместо void и не е нужно да сравнявате нещата с true: charStack.empty() == true е същото като charStack.empty().

person amillara    schedule 18.12.2010

Вижте моите коментари на линия.

// You can empty the stack here.
charStack.pop(); 

while(priority(n1) >= priority(input[n])){
    ...

    // BUG: This line will crash if the stack is empty.
    // You need to check for an empty stack.
    n1 = charStack.top(); 
person Sanjit Saluja    schedule 18.12.2010
comment
Благодаря за отговора. :D Същото като човека по-горе, но го оценявам. - person d2jxp; 19.12.2010