код для преобразования инфикса в постфикс - PullRequest
0 голосов
/ 09 октября 2011

Я написал код для преобразования из инфикса в постфикс. Этот фрагмент кода не сталкивается с какими-либо ошибками времени компиляции, но после получения входного выражения инфикса он выдает некоторые ошибки времени выполнения, которые я не могу понять, что эти ошибки являются чем-то связано со строкой, как говорится в сообщении.

#include<iostream>
#include<string>

#define N 50
using namespace std;

class stack
{
private:
    char arr[N];
    int tos;

public:
    void push(char p)
    {
        if (tos != N)
            arr[++tos] = p;
        else
            cout << "stack full";
    }

    char pop()
    {
        if (tos == -1)
            cout << "stack Empty";
        else
            return (arr[tos--]);
    }

    bool isempty()
    {
        if (tos == -1)
            return (true);
        else 
            return (false);
    }

    char top()
    {
        return arr[tos];
    }

    stack()
    {
        tos = -1;
    }
};

int pres(char sym)
{
    if (sym == '^')
        return 3;
    else if (sym == '*' || '/')
        return 2;
    else if (sym == '+' || '-')
        return 1;
    else if (sym == '(')
        return 0;
} 

bool isoperator(char op)
{
    if (op=='+' || op=='-' || op=='/' || op=='*' || op=='^')
        return true;
    else
        return false;
}

int main()
{
    string infix, postfix;
    stack s;
    int in=0;
    int post=0;

    cout << "Enter an infix expression: ";
    cin >> infix;
    s.push('(');
    infix.append(")");
    char temp;

    while (!(s.isempty()))
    {
        if (isdigit(infix[in]))
            postfix[post++] = infix[in];
        else if (infix[in] == '(')
            s.push(infix[in]);
        else if (infix[in] == ')')
        {
            while (1)
            {
                temp = s.pop();
                if (temp == '(')
                    break;
                else
                    postfix[post] = infix[in];
            }
        }
        else if (isoperator(infix[in]))
        {
            while (pres(s.top()) >= pres(infix[in]))
                postfix[post++] = s.pop();

            s.push(infix[in]);
        }
        in++;
    }

    cout << "Postfix expression is: " << postfix;
    system("pause");

}

Я не могу понять, что с этим не так. Может ли кто-нибудь помочь ??

Ответы [ 2 ]

2 голосов
/ 09 октября 2011

Я нашел следующие логические ошибки в вашем коде:

  • строка результата postfix пуста в начале, но вы пишете в позиции одного символа, используя postfix[post++]=. Это недопустимо и, вероятно, вызывает ошибки, связанные со строками. Вы должны использовать postfix.push_back() только для добавления символов в строку вывода.
  • В первом внутреннем цикле while (while(1)) последний оператор должен читать

    postfix.push_back(temp);

    поскольку вы хотите добавить операторы из стека к выводу.

  • Ваш код ложно принимает ввод с несбалансированными дополнительными закрывающими родителями, такими как "1 + 4)". Лично я бы поставил входную позицию как условие внешнего цикла и проверил бы, что стек пуст после цикла (и проверил наличие пустого стека в функции pop()) для обнаружения ошибок ввода.
1 голос
/ 09 октября 2011

Самая большая ошибка в его функции pres (), это должно быть:

else if (sym == '*' || sym == '/')
else if (sym == '+' || sym == '-')

Я заметил некоторые ошибки, упомянутые MartinStettner.

...