抱歉,我意识到我在这个问题中输入了所有代码。对于其他学生来说,我的所有代码都等同于这个特定问题的大部分答案,这是非常愚蠢的。
以下是我提出的问题的基本要点:
我需要识别常规数学表达式(例如5 + 6)中的单位数字以及双位数字(例如56 + 78)。数学表达式也可以显示为56 + 78(无空格)或56 + 78等等。
实际问题是,无论输入是什么,我都在表达式中读取5 6 + 7 8。
感谢和抱歉,我几乎删除了这个问题,但我的目标不是为家庭作业问题提供答案。
Jesse Smothermon
答案 0 :(得分:2)
问题实际上由两部分组成:输入(将字符序列转换为“标记”序列)和评估表达式。如果分别执行这两项任务,则应该更容易。
首先,读入输入并将其转换为标记序列,其中每个标记是一个运算符(+
,-
等)或操作数(42
,等)。
然后,对此令牌序列执行中缀到后缀转换。 “令牌”类型不必是任何花哨的东西,它可以简单如下:
struct Token {
enum Type { Operand, Operator };
enum OperatorType { Plus, Minus };
Type type_;
OperatorType operatorType_; // only valid if type_ == Operator
int operand_; // only valid if type_ == Operand
};
答案 1 :(得分:1)
首先,它有助于移动这样的if
userInput[i] != '+' || userInput[i] != '-' || userInput[i] != '*' || userInput[i] != '/' || userInput[i] != '^' || userInput[i] != ' ' && i < userInput.length()
进入自己的功能,只为了清晰。
bool isOperator(char c){
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
}
此外,无需检查它是否为运算符,只需检查输入是否为数字:
bool isNum(char c){
return '0' <= c && c <= '9';
}
另一件事,如果输入字符是 anyhing 而不是tempNumber += ...
,那么上面的长链就会出现问题,你也会输入'+'
块。您必须使用上面的函数检查&&
或更好:
if (isNum(userInput[iterator])){
tempNumber += userInput[iterator];
}
这也将排除任何无效的输入,例如b
,X
等。
然后,对于您的双位数字问题:
问题是,在插入tempNumber
后,总是输入空格。如果数字序列完成,您只需要这样做。要解决此问题,只需修改长if-else if
链的末尾:
// ... operator stuff
} else {
postfixExpression << tempNumber;
// peek if the next character is also a digit, if not insert a space
// also, if the current character is the last in the sequence, there can be no next digit
if (iterator == userInput.lenght()-1 || !isNum(userInput[iterator+1])){
postfixExpression << ' ';
}
}
这应该完成从56 + 78 --> 56 78 +
给出正确表示的工作。请告诉我是否有任何错误。 :)