Реализация функции, которая оценивает простые математические выражения. (C ++) - PullRequest
0 голосов
/ 27 марта 2019

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

Функция должна принимать такую ​​строку:

"5 * 44 + 3/2 * 4 - 12"

И вернуть результат в виде двойного числа.

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

using namespace std;

vector<string> split(const std::string& str, char delim = ' ')
{
    vector<string> elements;
    stringstream ss(str);
    string token;
    while (getline(ss, token, delim)) {
        elements.push_back(token);
    }

    return elements;
}


double evaluate(string operation)
{
    vector<string> values = split(operation, ' ');
    stack<string> result_stack;
    double result = 0;

    for(unsigned int i = 0; i < values.size(); i++){
        if(values[i] == "*"){
            double mini_result = stod(result_stack.top()) * stod(values[i+1]);
            result_stack.pop();
            i++;
            result_stack.push(to_string(mini_result));
        }
        else if(values[i] == "/"){
            double mini_result = stod(result_stack.top()) / stod(values[i+1]);
            result_stack.pop();
            i++;
            result_stack.push(to_string(mini_result));
        }
        else{
            result_stack.push(values[i]);
        }
    }

    for(unsigned int i = 0; i<result_stack.size(); i++){
        if(result_stack.top() == "-"){
            result_stack.pop();
            result = stod(result_stack.top()) - result;
            result_stack.pop();
        }
        else if(result_stack.top() == "+"){
            result_stack.pop();
            result += stod(result_stack.top());
            result_stack.pop();
        }
        else{
            result += stod(result_stack.top());
            result_stack.pop();
        }
    }

    return result;

}




int main()
{

    cout<<evaluate("5 * 44 + 3 / 2 * 4 - 12");
}

Перед вторым циклом for значения в result_stack должны быть такими для этого примера.«12 | - | 6 | + | 220».И возвращаемое значение должно быть 214.

Но перед вторым циклом for стек содержит только значения «12 | - | 6».Значения «+» и «220» отсутствуют.Возникают некоторые дополнительные всплывающие окна, которые я не ожидаю.

содержимое стека должно быть таким для этого примера

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Ответил здесь: ответ на вопрос

Завершенный код здесь:

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <stack>

using namespace std;

string trim(const string& str)
{
    size_t first = str.find_first_not_of(' ');
    if (string::npos == first)
    {
        return str;
    }
    size_t last = str.find_last_not_of(' ');
    return str.substr(first, (last - first + 1));
}

vector<string> split(const std::string& str, char delim = ' ')
{
    vector<string> elements;
    stringstream ss(str);
    string token;
    while (getline(ss, token, delim)) {
        elements.push_back(token);
    }

    return elements;
}

double evaluate(string operation)
{
    vector<string> values = split(operation, ' ');
    vector<string> result_vector;
    double result = 0;

    for(unsigned int i = 0; i < values.size(); i++){
        if(values[i] == "*"){
            double mini_result = stod(result_vector.back()) * stod(values[i+1]);
            result_vector.pop_back();
            i++;
            result_vector.push_back(to_string(mini_result));
        }
        else if(values[i] == "/"){
            double mini_result = stod(result_vector.back()) / stod(values[i+1]);
            result_vector.pop_back();
            i++;
            result_vector.push_back(to_string(mini_result));
        }
        else{
            result_vector.push_back(values[i]);
        }
    }

    auto iterator = result_vector.begin();
    while(iterator != result_vector.end()){
        if(*iterator == "-"){
            iterator++;
            result -= stod(*iterator);
        }
        else if(*iterator == "+"){
            iterator++;
            result += stod(*iterator);
        }
        else{
            result += stod(*iterator);
        }
        iterator++;
    }
    return result;
}


int main()
{
    cout<<evaluate("5 * 44 + 3 / 2 * 4 - 12");
}

0 голосов
/ 27 марта 2019

Ваши операнды для операции вычитания меняются местами. Это потому, что при обработке стека для операций + и - вы анализируете уравнение справа налево.

В вашем примере, когда в стеке найдено -, result равно 12. Вы вводите -, затем вычитаете 6, оставляя 6 в результате, когда оно должно быть -6.

Вы должны использовать

result = stod(result_stack.top()) - result;

для вычитания.

В вашем коде также нет проверки ошибок для некорректных уравнений.

...