RPN ayrıştırma iki denklem aynı gösterimde vermek ancak farklı cevaplar var

1 Cevap php

Ben bir earlier question yorumlarına dayanarak RPN bir denklemin bir dize temsilini dönüştürür PHP bir ayrıştırıcı yazdı ettik. Test ederken ben RPN de aynı şeyi ayrıştırmak iki farklı denklemleri bulundu. Bunları çözmek zaman RPN de aynı şey olarak sona çünkü aynı cevabı alırsınız.

  1. * 8 / (1 -5) 3 + 4
  2. 4 * 3 + 8/1 -5

Her ikisi de 348 * 15 olarak sona - ilki için doğru -5 bir cevap verir çözüldü zaman / +, ama ikinci birine cevap 30 olmalı.

Yani RPN dönüştürmek için nasıl yanlış var? Benim ayrıştırıcı kod önceki soruya yukarıdaki linke bulunabilir.

1 Cevap

Ben ayrıştırıcı hatası bulundu. Son büyük else bloğunda, değiştirmek gerekir

$current = end($stack);
if($operators[$tokens[$i]] == $operators[$current]) {
  $rpn .= array_pop($stack);
  $stack[] = $tokens[$i];
} else {
  $stack[] = $tokens[$i];
}

ile

while(!empty($stack) && end($stack) != '(' && $operators[$tokens[$i]] >= $operators[end($stack)]) {
  $rpn .= array_pop($stack);
}
$stack[] = $tokens[$i];

Bu değişiklikten sonra, iki test durumlarda burada iyi çalışır. (. Senin söz sorunu gidermekle sonra kodunuzu kontrol durdu, bu yüzden içinde daha fazla hatalar olabilir kullanılan this reference kodunuzu düzeltmek için - Ben kanıtı okumak her şeyi yoktu!)

EDIT: The important thing is replacing "==" ile ">=". If you will always have only two levels of precedence, replacing the if ile a loop is not strictly necessary.