تحليل إلى RPN معادلتين تعطي نفس النوتة ولكن لديهم إجابات مختلفة

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

  •  05-07-2019
  •  | 
  •  

سؤال

لقد كتب المحلل في بي ان يحول تمثيل سلسلة من المعادلة إلى RPN على أساس التغذية المرتدة من في وقت سابق من السؤال.بينما اختبار ذلك وجدت اثنين من المعادلات المختلفة أن تحليل إلى نفس الشيء في RPN.لأنها في نهاية المطاف نفس الشيء في RPN عند حل لهم يمكنك الحصول على نفس الإجابة.

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

سواء في نهاية المطاف 348*15-/+ والتي عندما حل يعطي جوابا -5 وهو الصحيح ، ولكن الجواب على الثاني يجب أن يكون 30.

لذلك قد أسأت فهم كيفية تحويل إلى RPN?رمز إلى محلل يمكن العثور عليها في الرابط أعلاه على السؤال السابق.

هل كانت مفيدة؟

المحلول

لقد وجدت خطأ في محلل.في الماضي كبيرة else كتلة, تحتاج إلى استبدال

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

مع

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

بعد هذا التغيير, جهاز اختبار الحالات تعمل بشكل جيد هنا.(أنا استخدم هذا المرجع إلى إصلاح التعليمات البرمجية الخاصة بك.توقفت التحقق من التعليمات البرمجية الخاصة بك بعد تحديد المشكلة في السؤال ، لذلك قد يكون هناك أكثر الأخطاء داخل-لم يكن دليلا على قراءة كل شيء!)

تحرير:الشيء المهم هو استبدال "==" مع ">=".إذا كنت سوف يكون دائما اثنين فقط من مستويات الأسبقية استبدال if مع حلقة ليس ضروريا تماما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top