让我们说我希望从用户那里收到两个数学运算(例如+ - %
)并相应地计算数字。我们还说我可以使用一个 if/else
语句来确定优先级(并且所有操作都有不同的优先级)。
我有几个想法用于实施,并希望得到关于哪些被认为是更好的反馈"编码(更清晰,更有效等)。
我可以这样做:
if (firstOperator >= secondOperator){
switch (firstOperator){
case '+':
switch (secondOperator)
// insert all 6 possible cases
case '-':
switch (secondOperator)
// insert all 5 possible cases
...
...
}
else{
// same idea as above
}
或者我可以通过为switch
的每个选项创建一个firstOperation
来简单地对所有选项进行硬编码,并在每个switch
中嵌套第二个cases
对于所有可能的secondOperation
。
这两种方法不同,我还有一两种方法。我原以为第一个更正是"正确"优雅,但它实际上导致更多的代码行而不是"蛮力"全力以赴的第二选择。
我很想听到关于这种编码的任何意见。
注意:我只谈论非常基本的C编程(即不使用其他数据结构,如堆栈等。只需基本的if/else
,switch
,loops
等。
答案 0 :(得分:1)
这是我如何做到的,但这取决于你的第一次和第二次操作是独立处理的(如果你正在做的是一个表达式评估器,我认为这应该是可能的)。在我的例子中,我假设有一个队列持有按解析顺序解析的参数。
if (firstOperator >= secondOperator) {
handle(firstOperator);
handle(secondOperator);
} else {
// Assuming something like 1 + 2 * 3, with 1 2 3 in the queue:
//
// tmp = dequeueArg() makes the queue: 2 3
// handle('*') makes the queue: 6
// pushFront(tmp) makes the queue: 1 6
// handle('+') makes the queue: 7
//
int tmp = dequeueArg();
handle(secondOperator);
pushFront(tmp);
handle(firstOperator);
}
void handle(Op operator)
{
int x = dequeueArg();
int y = dequeueArg();
switch (operator) {
case '+': pushFront(x+y); break;
case '-': pushFront(x-y); break;
case '*': pushFront(x*y); break;
case '/': pushFront(x/y); break; // Maybe check for 0
case '%': pushFront(x%y); break; // Maybe check for 0
case '&': pushFront(x&y); break;
etc...
}
}
我在这里写的内容可能不适用于具有优先权的通用中缀解析器。它是一个如何不使用O(N ^ 2)嵌套的case语句的例子。