Parsen zu RPN zwei Gleichungen geben gleiche Schreibweise, aber unterschiedliche Antworten
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.
- 3 + 4 * 8 / (1 -5)
- 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.
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.