Я пытаюсь написать функцию, которая оценивает простые математические выражения (всего четыре операции).Я использовал стек и вектор, чтобы сделать это.Но операции со стеком ведут себя не так, как я ожидаюЯ не мог найти причину.Я открыт для разных решений.
Функция должна принимать такую строку:
"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» отсутствуют.Возникают некоторые дополнительные всплывающие окна, которые я не ожидаю.
содержимое стека должно быть таким для этого примера