我会尽量说得尽可能简单。请注意,我在这里花了几个小时寻找答案,也在每个维基页面上寻找答案,并且几天来我一直在努力解决这个问题。
该项目是一个单行计算器,具体有问题的代码部分是:
for (int i = 0; i < operatorPositions.size(); i++)
{
if (toProcess.at(operatorPositions.at(i)) == "(" || toProcess.at(operatorPositions.at(i)) == ")")
{
int storedPosition = operatorPositions.at(i);
for (int j = i + 1; j < operatorPositions.size(); j++)
{
operatorPositions.at(j)--;
}
operatorOrder.erase(operatorOrder.begin() + i);
operatorPositions.erase(operatorPositions.begin() + i);
toProcess.erase(toProcess.begin() + storedPosition);
}
}
此时operatorPositions和operatorOrder是相同的。 operatorPositions 是一个 int 向量,operatorOrder 是一个 int 指针向量。
toProcess 是一个字符串向量,是在运算符和数字之间解析的输入。看起来像:
输入:5*(5+5)
要处理:5,*,(,5,+,5,)
操作员位置:1,2,4,6
为了使括号在操作顺序中具有更高的优先级,我需要从具有运算符位置的整数向量中删除一个元素,以及从指向前一个向量元素的指针向量中删除一个元素。
但是这样做会导致删除错误的元素或元素较多或较少,这很奇怪。
代码片段可以在注释//括号移除中找到。
可以使用5*(5+5)来重现
(5+5)*5 效果很好
我知道这不是最好的代码,但我正在努力学习。
我意识到了一种更好的方法,但我仍然想学习并知道那里出了什么问题。 谢谢你
我想你想要这个:
auto itorPos = operatorPositions.begin();
auto itorOrder = operatorOrder.begin();
while (itorPos != operatorPositions.end())
{
if (toProcess.at(*itorPos) == "(" || toProcess.at(operatorPositions.at(*itorPos)) == ")")
{
int storedPosition = *itorPos;
for (int j = i + 1; j < operatorPositions.size(); j++)
{
operatorPositions.at(j)--;
}
itorOrder = operatorOrder.erase(itorOrder);
itorPos = operatorPositions.erase(itorPos);
toProcess.erase(toProcess.begin() + storedPosition);
}
else
{
itorOrder++;
itorPos++;
}
}
上面的改动基本上是这样的: