Печать отдельных операций из строки выражения постфикса в C ++ - PullRequest
0 голосов
/ 04 февраля 2019

Требуется помощь в разбивке выражений постфикса и выводе каждой отдельной операции.Моя проблема не в оценке действительного выражения, а в печати каждой отдельной операции перед оценкой.

Я использую C ++ для написания программы, которая оценивает выражения postfix.Типы выражений, которые будут приняты, находятся в инфиксной нотации и используют заглавные буквы (AZ) и эти четыре операции: *, /, + и -.

Примером этого может быть: (A + B) * (F - G)

Я написал функцию, которая меняет инфикс на постфикс:

AB+FG-*

Теперь я хотел бы написать функцию, которая выводит каждую отдельную операцию.Для приведенного выше примера это будет выглядеть примерно так:

Операции:

AB +

FG-

AB + FG - *

Необходимо будет выводить операции в порядке приоритета.Так как A и B заключены в скобки, сначала их нужно будет сделать, и так далее.Я попытался написать функцию, которая принимает выражение постфикса в качестве ввода и ничего не возвращает.Функция создает стек типа char и перебирает выражение от начала до конца.

Если символ является операндом, он помещается в стек.Если символ является оператором, два верхних значения стека сохраняются в переменных типа char и затем выводятся с соответствующим оператором.

Однако моя функция, похоже, не выводит операции правильно.

#include<iostream>
#include<stack>
#include <algorithm> 
#include <cstdlib>
#include<string>

void operations(string exprsn) {

char op1, op2;
int len, x, j = 0;
len = exprsn.length();
stack<char>s;
string ns;

for (int i = 0; i < len; i++) {

    if (exprsn[i] >= 'A' && exprsn[i] <= 'Z') {
        s.push(exprsn[i]);
    }

    else if (isOperator(exprsn[i])) {
        op1 = s.top();
        s.pop();
        op2 = s.top();
        s.pop();
        switch (exprsn[i]) {
        case '+':
            s.push(op2 + op1 + '+' );
            cout << op2 << op1 << "+\n";
            break;
        case '-':
            s.push(op2 + op1 + '-');
            cout << op2 << op1 << "-\n";
            break;
        case '*':
            s.push(op2 + op1 + '*');
            cout << op2 << op1 << "*\n";
            break;
        case '/':
            s.push(op2 + op1 + '/');
            cout << op2 << op1 << "/\n";
            break;
        }

        }


    }
}

int main(){
string s = "AB+CD-*";
operations(s);
return 0;
}

Ожидаемый выход:

AB +

CD-

AB + CD - *

Фактический выход:

AB +

CD-

«┤ *

Я не уверен, что происходит с последней строкой, но я думаю, что это как-то связано с тем, как я толкаюсимволов в стек.

Вот еще один пример:

Выражение инфикса: (A + B) / C + (D - E) * F * (G - H)

После преобразования в постфиксную запись:

AB+C/DE-F*GH-*+

Ожидаемый результат:

AB+

DE-

GH-

DE-F*

GH-*

AB+C/

AB+C/DE-F*GH-*+

Фактический результат:

AB +

«C /

DE-

╢F *

GH-

& ╝ *

+

Я знаю, что ягде-то идет ужасно неправильно, и я с трудом понимаюING.Любая помощь очень ценится.Спасибо.

1 Ответ

0 голосов
/ 04 февраля 2019

Ошибка в программе вызвана переменной стека s, использующей тип char, а не тип string, который необходим для хранения нескольких символов.

Когда op2 + op1 + '+' помещается наВ стеке знаки + не объединяют символы op2, op1 и '+' вместе, поскольку все типы данных каждой из переменных являются символами.Скорее, знаки + складывают числовое значение ascii каждого из символов, что приводит к странному выводу.

Вот исправленная версия кода:

void operations(string exprsn)
{

    string op1, op2;
    int len, x, j = 0;
    len = exprsn.length();
    stack<string> s;
    string ns;

    for (int i = 0; i < len; i++)
    {

        if (exprsn[i] >= 'A' && exprsn[i] <= 'Z')
        {
            s.push(string(1, exprsn[i]));
        }

        else if (isOperator(exprsn[i]))
        {
            op1 = s.top();
            s.pop();
            op2 = s.top();
            s.pop();
            switch (exprsn[i])
            {
            case '+':
                s.push(op2 + op1 + '+');
                cout << op2 << op1 << "+\n";
                break;
            case '-':
                s.push(op2 + op1 + '-');
                cout << op2 << op1 << "-\n";
                break;
            case '*':
                s.push(op2 + op1 + '*');
                cout << op2 << op1 << "*\n";
                break;
            case '/':
                s.push(op2 + op1 + '/');
                cout << op2 << op1 << "/\n";
                break;
            }
        }
    }
}

int main()
{
    string s = "AB+CD-*";
    operations(s);
    return 0;
}

...