在将中缀转换为前缀的第一步中,有人可以用简单的术语解释为什么我们应该反转字符串吗?有没有其他转换方法?
是的,你是绝对正确的,如果你必须将中缀转换为前缀,那么你必须从右到左扫描字符串。
为什么不从左到右?
如果您从左到右扫描,那么您将需要了解字符串中的运算符。
示例1:
Infix : 2+3
Prefix : +23
现在,当您将其从左转换为右时,您应该了解字符串中尚未出现的+。在这个特定的示例中,这看起来很简单,现在考虑下面给出的另一个示例。
示例2:
Infix : 2+3*4/5-6*7
Prefix : -+2/*345*67
现在,如果您从左到右扫描,那么当您扫描字符串的第 0 个索引时,程序应该知道 - 这将出现在字符串的第 7 个索引中,这可能是一项繁忙的工作。
所以最安全的方法是从右向左扫描字符串。
在将中缀转换为前缀的第一步中,有人可以用简单的术语解释为什么我们应该反转字符串吗?
在没有说明您指的是哪种算法的情况下,您让我们猜测,但一个简单的猜测是:
请注意,在步骤 2 中,操作数 1 是第一个被弹出的。
显然,为什么你不能从左到右读取字符串的原因在这个算法中是相当明显的:你读到的第一个是一个运算符,并且你不会有任何操作数要弹出。
该算法之所以有效,是因为它将其转换为后缀,并使用了将后缀转换为中缀的算法。 “有点”是因为在反转时,您不仅将运算符放在操作数后面,还反转了操作数的顺序(这就是为什么在步骤 2 中您将顶部操作数视为左侧操作数)。
有没有其他转换方法?
是的,因为上面的算法基本上是抽象地评估后缀表达式并将其表示为中缀。您可以直接使用前缀表达式执行相同的操作。
这是伪代码:
start reading infix from left to right
if scannedElement is '('
push scannedElement to operator stack
else if scannedElement is ')'
while (operatorStack peek is not equal to "(")
operator is equal to operator stack pop
firstPopOperand is equal to operand stack pop
secondPopOperand is equal to operand stack pop
formedOperation = operator + secondPopOperand + firstPopOperand
push formedOperation to operandStack
pop from operator stack (this will be "(")
else if scannedElement is an operator
if operatorStack is empty or operatorStack peek's precedence smaller than scannedElement precedence
operatorStack.push scannedElement
else
while (operatorStack is not empty
and operatorStack peek's precedence bigger than or equal to scannedElement precedence)
operator is equal to operator stack pop
firstPopOperand is equal to operand stack pop
secondPopOperand is equal to operand stack pop
formedOperation = operator + secondPopOperand + firstPopOperand
push formedOperation to operandStack
push scannedElement to the operator stack
if scannedElement is an operand
push the scannedElement to operandStack
after the infix string scanned
while (operatorStack is not empty)
operator is equal to operator stack pop
firstPopOperand is equal to operand stack pop
secondPopOperand is equal to operand stack pop
formedOperation = operator + secondPopOperand + firstPopOperand
push formedOperation to operandStack
result is equal to operandStack peek