最近我经历了一些网站, 将中缀转换为前缀符号并最终将其隐藏起来。
我已经完成了我已经完成的步骤..
Ex: - (1+(2 * 3))+(5 * 6)+(7/8)
方法1: - (没有任何算法的手动转换): -
Step1: (1+(*23)) + (*56) + (/78)
Step2: (+1*23) + (*56) + (/78)
Step3: +(+1*23)(*56) + (/78)
Step4: +[+(+1*23)(*56)](/78)
Step5: +++1*23*56/78 **--- Final Ans -----**
方法2: -
根据网站http://scanftree.com/Data_Structure/infix-to-prefix
Step1: Reverse it:- ) 8 / 7 ( + ) 6 * 5 ( + ) ) 3 * 2 ( + 1 ( Step2: Replace the '(' by ')' and vice versa: ( 8 / 7 ) + ( 6 * 5 ) + ( ( 3 * 2 ) + 1 ) Step3: Convert the expression to postfix form:- 8 7 / 6 5 * + 3 2 * 1 + + Step4: Reverse it + + 1 * 2 3 + * 5 6 / 7 8 --- Final Ans -----
所以,我在这里完全被绞死了。
任何人都可以对以下事项提供一些启示: -
所以我能够更好地理解这个概念。
答案 0 :(得分:2)
您的方法不正确,请查看评论,它说( a + b ) + c = a + ( b + c )
。那么(a + b) * c? (a + b) * c != a + (b * c)
呢。
根据您的手动算法,您将最后+
放在前面。这是不正确的。如果您使用*
代替上一个+
,您在哪里放置它?考虑一下,然后您可以轻松找到算法的问题。
解决此问题的另一种算法在继续之前只是括号。将每个左括号替换为其中的运算符。
例如,((1+(2*3)) + ((5*6) + (7/8)))
然后它变为++1*23+*56+/78
。如果内部运算符的优先级相同,则算法正确。如果不是,它就会失败。
注意:您的答案也可以通过括号的排列获得。
(((1+(2*3)) + (5*6)) + (7/8))
然后它变为+++1*23*56/78
。但如果最后一个是*
而不是+
,那么它就不起作用了。
答案 1 :(得分:1)
(b * b - 4 * a * c)/(2 * c)公式 - 1;
现在我将通过替换不同的变量来数学地解决这个问题,并且在时间上做2个术语
的 => x = bb *; y = 4a *; Z = 2C * 强>
以上这些是第一次的替代,用于方程1
(x - y * c)/(z)
再次使用新变量进行替换
的 => i = yc *;
(x - i)/ z
的 => J = XI - ; 强>
的Ĵ/ Z 强>
现在这是基础案例解决它然后相应地替换所有变量
的 JZ / 强>
现在回来替换
xi- 2c * /
bb * yc * - 2c * /
bb * 4a * c * -2a * /
答案 2 :(得分:0)
手动转换是正确的,因为当我们反转infix表达式以计算前缀时,该表达式的关联性从左到右从右到右到左变化,这在算法中没有考虑,并且常常被忽略。
示例: 表达式:5-3-2:前缀前缀(手动转换) (-5 3)-2 -(-5 3)2 --5 3 2
现在通过算法(如果关联性未更改) 反向表达:2-3-5
后缀:2 3-5-
再次反向以获取前缀:-5-3 2
现在看看我们是否忽略了关联性,它产生了巨大的变化
现在,如果我们将关联性从左到右从右到左更改:
然后:
反向表达:2-3-5
后缀:2 3 5--(就像a ^ b ^ b后缀:abc ^^,因为它也是正确的关联对象
反向--5 3 2