Как нажать или вытолкнуть из стека символов, а затем выполнить вычисления - PullRequest
0 голосов
/ 10 октября 2019

Попытка выполнить вычисления для полностью круглых (инфиксных) уравнений, которые считываются в стек и конвертируются в постфикс. Я могу вывести правильную запись постфикса после чтения из массива уравнений, но мои вычисления не верны, когда я пытаюсь запустить свои функции в стеках. Включенный код выглядит как вывод окончательного числа из уравнения по всем трем уравнениям вместо выполнения каких-либо вычислений. Нам были даны все функции push и pop, но мы должны были написать экспоненциальную часть стека «save», где, я думаю, что-то не так. Ответы по модулю 10 по какой-то причине неверны.

Я подумал, что, возможно, он не выполняет вычисления, потому что стек - это набор символов, поэтому я попытался преобразовать в тип int, но не думаю, чтоделаю это правильно, или если в этом и заключается моя проблема.

class STACK
{
    private:
        char *s;
        int N;
    public:
        STACK(int maxN) {
            s = new char[maxN];
            N = 0;
        }
        int empty() {
            return N ==0;   
        }
        void push(char item) {
            s[N++] = item;
        }
        char pop() {
            return s[--N];
        }

};

Дополнение стека для одного из трех уравнений

    STACK operation(aSize);
    for (int i = 0; i < aSize; i++)
    {
        if (a[i] == ')') {
            cout << operation.pop() << "";
        }
        if ((a[i] == '+') || (a[i] == '*') || (a[i] == '^')) {
            operation.push(a[i]);
        }
        if ((a[i] >= '0') && (a[i] <= '9')) {
            cout << a[i] << "";
        }
    }
    cout << endl;

    // evalutates infix notation in modulo 10
    for (int i = 0; i < aSize; i++) 
    {
        if (a[i] == '+') {
            operation.push((operation.pop() + operation.pop()) % 10);
        }
        if (a[i] == '*') {
            operation.push((operation.pop() * operation.pop()) % 10);
        }
        if ((a[i] >= '0') && (a[i] <= '9')) {
            operation.push(a[i]);
        }
        if (a[i] == '^') {
            exponent = operation.pop();
            base = operation.pop();
            result = pow(base, exponent);
            result = result % 10;
            operation.push(result);
        }
    }
    cout << operation.pop() << " in modulo 10." << endl;
    operation.empty();

Входные уравнения 1, 2 и 3:

((2+(5^2))+7)
((((2+5)*7)+((9*3)*2))^2)
((((2*3)*(4*6))*7)+(((7+8)+9)*((2+4)*((7+8)+9))))

Требуемый выход:

252^+7+
4 in modulo 10
25+7*93*2*+2^
9 in modulo 10
23*46*7*789++24+78+9+**+
4 in modulo 10

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

252^+7+
7 in modulo 10.
25+7*93*2*+2^
2 in modulo 10.
23*46**7*78+9+24+78+9+**+
9 in modulo 10.
...