0

抱歉,我意识到我在这个问题中输入了所有代码。我的所有代码都等于其他学生针对这个特殊问题的大部分答案,这很愚蠢。

这是我提出的问题的基本要点:

我需要识别正则数学表达式中的单个数字(例如 5 + 6)以及两位数(例如 56 + 78)。数学表达式也可以显示为 56+78(无空格)或 56+78 等。

实际的问题是,无论输入是什么,我都将表达式读取为 5 6 + 7 8。

谢谢和抱歉,我几乎删除了这个问题,但我的目标不是为家庭作业问题提供答案。

杰西·斯莫莫

4

2 回答 2

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
};
于 2011-03-27T02:32:49.903 回答
1

首先,它有助于移动这样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 +。请告诉我是否有什么问题。:)

于 2011-03-27T03:05:59.357 回答