Оценка выражения инфикса с использованием стека в C ++ - PullRequest
0 голосов
/ 03 апреля 2020

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


#include <iostream>
#include"stacklink.h"
#include"stacklink.cpp"
#include<bits/stdc++.h>

using namespace std;

int precedence(char op){
    if(op == '+'||op == '-')
    return 1;
    if(op == '*'||op == '/')
    return 2;
    return 0;
}
int applyOp(int a, int b, char op){
    switch(op){
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': return a / b;
    }
}
int evaluate(string tokens){
    int i;
    StackType <int> values;
    StackType <char> ops;

    for(i = 0; i < tokens.length(); i++){

        if(tokens[i] == ' ')
            continue;

        else if(tokens[i] == '('){
            ops.Push(tokens[i]);
        }

        else if(isdigit(tokens[i])){
            int val = 0;

            while(i < tokens.length() &&
                        isdigit(tokens[i]))
            {
                val = (val*10) + (tokens[i]-'0');
                i++;
            }

            values.Push(val);
        }

        else if(tokens[i] == ')')
        {
            while(!ops.IsEmpty() && ops.Top() != '(')
            {
                int val2 = values.Top();
                values.Pop();

                int val1 = values.Top();
                values.Pop();

                char op = ops.Top();
                ops.Pop();

                values.Push(applyOp(val1, val2, op));
            }

            if(!ops.IsEmpty())
               ops.Pop();
        }

        else
        {
            while((!ops.IsEmpty()) && precedence(ops.Top())
                                >= precedence(tokens[i]))  {
                int val2 = values.Top();
                values.Pop();

                int val1 = values.Top();
                values.Pop();

                char op = ops.Top();
                ops.Pop();

                values.Push(applyOp(val1, val2, op));
            }

            ops.Push(tokens[i]);
        }
    }

    while(!ops.IsEmpty()){
        int val2 = values.Top();
        values.Pop();

        int val1 = values.Top();
        values.Pop();

        char op = ops.Top();
        ops.Pop();

        values.Push(applyOp(val1, val2, op));
    }

    return values.Top();
}

int main() {
    //cout << evaluate("10 + 2 * 6") << "\n";
    //cout << evaluate("10 + 3 * 5 / ( 16 - 4 )") << "\n";
    //cout << evaluate("100 * ( 2 + 12 )") << "\n";
    //cout << evaluate("100 * ( 2 + 12 ) / 14");

    string infix;

    cin>>infix;
    cout<< evaluate(infix);
    return 0;
}

1 Ответ

0 голосов
/ 03 апреля 2020

Вместо использования cin >> infix используйте getline (cin, infix) Потому что в случае cin ввод будет до '' или ' \ n 'или' \ t ', и ваша строка содержит пробелы, поэтому она читает до черного пространства. Допустим, ваше выражение 10 + 2 , но оно читает выражение только как 10 . Но если вы будете использовать getline , он будет читать всю строку до "\ n".

Надеюсь, что это может помочь ....!

...