Parsen zu RPN zwei Gleichungen geben gleiche Schreibweise, aber unterschiedliche Antworten

StackOverflow https://stackoverflow.com/questions/1808546

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe geschrieben einen Parser in PHP, die eine String-Darstellung einer Gleichung zu RPN wandelt basierend auf dem Feedback von einem frühere Frage . Während es die Prüfung fand ich zwei verschiedene Gleichungen, die auf die gleiche Sache in RPN analysieren. Weil sie als die gleiche Sache in RPN am Ende, wenn Sie sie lösen Sie die gleiche Antwort erhalten.

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

Sowohl am Ende als 348 * 15 -. / + Die, wenn sie gelöst, eine Antwort von -5 gibt, die für die ersten richtig ist, aber die Antwort auf den zweiten sollte 30 sein

So habe ich das falsch verstanden, wie man RPN konvertieren? Der Code zu meinem Parser kann in dem obigen Link zur vorherige Frage gefunden werden.

War es hilfreich?

Lösung

fand ich den Fehler in Ihrem Parser. In Ihrem letzten großen else Block, müssen Sie ersetzen

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

mit

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

Nach dieser Änderung Ihre zwei Testfälle arbeiten hier in Ordnung. (I verwendet dieser Referenz Code zu beheben. Ich hörte Code Überprüfung nach das Problem in Ihrer Frage Festsetzung, so könnte es mehr Fehler sein innen - ich nicht korrekturgelesen alles tat)

EDIT: Das Wichtigste ist, zu ersetzen "==" mit "> =". Wenn Sie werden immer nur zwei Ebene des Vorrangs, mit einer Schleife der if ersetzen ist nicht unbedingt notwendig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top