抱歉,我意识到我在这个问题中输入了所有代码。我的所有代码都等于其他学生针对这个特殊问题的大部分答案,这很愚蠢。
这是我提出的问题的基本要点:
我需要识别正则数学表达式中的单个数字(例如 5 + 6)以及两位数(例如 56 + 78)。数学表达式也可以显示为 56+78(无空格)或 56+78 等。
实际的问题是,无论输入是什么,我都将表达式读取为 5 6 + 7 8。
谢谢和抱歉,我几乎删除了这个问题,但我的目标不是为家庭作业问题提供答案。
杰西·斯莫莫
这个问题实际上由两部分组成:对输入进行词法分析(将字符序列转换为“标记”序列)和评估表达式。如果您分别执行这两项任务,应该会容易得多。
首先,读入输入并将其转换为标记序列,其中每个标记是运算符(+
、-
等)或操作数(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
};
首先,它有助于移动这样if
的s
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';
}
另一件事是,对于上面的长链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 +
。请告诉我是否有什么问题。:)