我正在尝试编写一个计算简单数学表达式的函数(仅四个操作)。我用堆栈和向量来做到这一点。但是堆栈操作的行为不符合我的预期。我找不到原因。我愿意接受不同的解决方案。
该函数应采用这样的字符串:
“ 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”值不存在。发生了一些意外的意外弹出。
答案 0 :(得分:0)
您用于减法运算的操作数被交换。这是因为当您处理+
和-
操作的堆栈时,是从右到左解析方程式。
以您的示例为例,当在堆栈中找到-
时,result
为12
。弹出-
,然后减去6
,使6
留在应为-6
的位置。
您应该使用
result = stod(result_stack.top()) - result;
用于减法。
您的代码中也没有错误检查是否存在无效方程式。
答案 1 :(得分:0)