خوارزمية ساحة التحويل

في علم الحاسوب ، تُعدّ خوارزمية ساحة التحويل طريقةً لتحليل التعبيرات الحسابية أو المنطقية، أو مزيج منهما، المُحددة باستخدام تدوين الوسط . ويمكنها إنتاج سلسلة تدوين لاحقة، تُعرف أيضًا باسم تدوين بولندي معكوس (RPN)، أو شجرة بناء جملة مجردة (AST). [ 1 ] ابتكر هذه الخوارزمية إدسكار ديكسترا ، ونُشرت لأول مرة في نوفمبر 1961، [ 2 ] وسُميت بهذا الاسم لأن طريقة عملها تُشبه طريقة عمل ساحة تحويل السكك الحديدية .

على غرار تقييم RPN، تعتمد خوارزمية ساحة التحويل على المكدس . تُعدّ التعبيرات الوسطية شكلاً من أشكال الترميز الرياضي المألوف لدى معظم الناس، مثل "3 + 4" أو "3 + 4 × (2 − 1)" . للتحويل، يوجد متغيران نصيان ( سلاسل نصية ): المدخلات والمخرجات. يوجد أيضًا مكدس يحتوي على المعاملات التي لم تُضَف بعد إلى قائمة انتظار المخرجات. للتحويل، يقرأ البرنامج كل رمز بالترتيب وينفذ عمليةً بناءً على ذلك الرمز. ستكون نتيجة الأمثلة السابقة ( بالترميز البولندي العكسي ) "3 4 +" و "3 4 2 1 − × +" على التوالي.

ستقوم خوارزمية ساحة المناورة بتحليل جميع التعبيرات الوسطية الصحيحة بشكل صحيح، لكنها لا ترفض جميع التعبيرات غير الصحيحة. على سبيل المثال، "1 2 +" ليس تعبيرًا وسطيًا صحيحًا، ولكنه سيُحلل على أنه "1 + 2" . مع ذلك، يمكن للخوارزمية رفض التعبيرات التي تحتوي على أقواس غير متطابقة.

تم تعميم خوارزمية ساحة التحويل لاحقًا إلى تحليل أسبقية المشغل .

تحويل بسيط

  1. المدخلات: 3 + 4
  2. قم بدفع الرقم 3 إلى قائمة الإخراج (يتم دفع أي رقم يتم قراءته إلى قائمة الإخراج)
  3. ادفع علامة الجمع (+) (أو معرّفها) إلى مكدس العمليات
  4. أضف الرقم 4 إلى قائمة الإخراج
  5. بعد قراءة التعبير، قم بإزالة عوامل التشغيل من المكدس وأضفها إلى الناتج.
    في هذه الحالة يوجد واحد فقط، "+".
  6. الناتج: 3 4 +

هذا يُظهر بالفعل بعض القواعد:

  • يتم إرسال جميع الأرقام إلى المخرج عند قراءتها.
  • في نهاية قراءة التعبير، قم بإزالة جميع عوامل التشغيل من المكدس ووضعها على المخرجات.

رسم توضيحي

رسم توضيحي للخوارزمية، باستخدام تقاطع سكة ​​حديد ثلاثي الاتجاهات . تتم معالجة المدخلات رمزًا رمزًا: إذا وُجد متغير أو رقم، يُنسخ مباشرةً إلى المخرجات (أ)، (ج)، (هـ)، (ح). إذا كان الرمز عاملًا، يُضاف إلى مكدس العوامل (ب)، (د)، (و). إذا كانت أسبقية العامل أقل من أسبقية العوامل في أعلى المكدس، أو كانت الأسبقية متساوية وكان العامل تجميعيًا يساريًا، يُزال هذا العامل من المكدس ويُضاف إلى المخرجات (ز). أخيرًا، تُزال أي عوامل متبقية من المكدس وتُضاف إلى المخرجات (ط).

شرح الخوارزمية بالتفصيل

بينما توجد رموز يجب قراءتها: قراءة رمز مميز إذا كان الرمز المميز هو: - رقم : ضعها في قائمة الإخراج - دالة : قم بدفعه إلى مكدس المشغل - عامل التشغيل o 1 : بينما ( يوجد عامل o 2 في أعلى مكدس العوامل وهو ليس قوسًا مفتوحًا، و ( o 2 له أسبقية أكبر من o 1 أو ( o 1 و o 2 لهما نفس الأسبقية و o 1 هو تجميعي من اليسار)) ): قم بإخراج العنصر رقم 2 من مكدس العمليات إلى قائمة انتظار الإخراج. ادفع o 1 إلى مكدس العمليات - a "," : بينما لا يكون العامل الموجود في أعلى مكدس العوامل قوسًا مفتوحًا: قم بإخراج العامل من مكدس العوامل إلى قائمة انتظار الإخراج - قوس مفتوح (أي "("): قم بدفعه إلى مكدس المشغل - قوس أيمن (أي ")"): بينما العامل الموجود في أعلى مكدس العوامل ليس قوسًا أيسر: { تحقق من أن مكدس العمليات ليس فارغًا } /* إذا نفدت المكدس دون العثور على قوس مفتوح، فهذا يعني وجود أقواس غير متطابقة. */ قم بإخراج العامل من مكدس العوامل إلى قائمة انتظار الإخراج { تأكد من وجود قوس مفتوح في أعلى مكدس المعاملات} قم بإزالة القوس الأيسر من مكدس العمليات وتخلص منه. إذا كان هناك رمز دالة في أعلى مكدس المعاملات، فإن : قم بإخراج الدالة من مكدس العمليات إلى قائمة انتظار الإخراج /* بعد انتهاء حلقة while، انقل العناصر المتبقية من مكدس المعاملات إلى قائمة الإخراج. */ while there are tokens on the operator stack: /* إذا كان رمز المعامل في أعلى المكدس قوسًا، فهذا يعني وجود أقواس غير متطابقة. */ { assert the operator on top of the stack is not a (left) bracket} قم بإزالة العامل من مكدس العوامل إلى قائمة انتظار الإخراج

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

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

أمثلة تفصيلية

المدخلات: 3 + 4 × 2 ÷ ( 1 − 5 ) ^ 2 ^ 3

المشغلأسبقيةالترابط
^4يمين
×3غادر
÷3غادر
+2غادر
-2غادر

يرمز الرمز ^ إلى عامل الأس .

رمز مميزفعلالناتج (بوحدة RPN )مكدس العملياتملحوظات
3أضف الرمز المميز إلى المخرجات3
+أضف الرمز المميز إلى المكدس3+
4أضف الرمز المميز إلى المخرجات3 4+
×أضف الرمز المميز إلى المكدس3 4× +علامة × لها أولوية أعلى من علامة +
2أضف الرمز المميز إلى المخرجات3 4 2× +
÷قم بإزالة المكدس إلى المخرج3 4 2 ×+لكل من ÷ و × نفس الأسبقية
أضف الرمز المميز إلى المكدس3 4 2 ×÷ +للقسمة (÷) أولوية أعلى من الجمع (+).
(أضف الرمز المميز إلى المكدس3 4 2 ×( ÷ +
1أضف الرمز المميز إلى المخرجات3 4 2 × 1( ÷ +
-أضف الرمز المميز إلى المكدس3 4 2 × 1− ( ÷ +
5أضف الرمز المميز إلى المخرجات3 4 2 × 1 5− ( ÷ +
)قم بإزالة المكدس إلى المخرج3 4 2 × 1 5 −( ÷ +كرر حتى يتم العثور على "("
كومة من البوب3 4 2 × 1 5 −÷ +تجاهل الأقواس المتطابقة
^أضف الرمز المميز إلى المكدس3 4 2 × 1 5 −^ ÷ +^ لها أولوية أعلى من ÷
2أضف الرمز المميز إلى المخرجات3 4 2 × 1 5 − 2^ ÷ +
^أضف الرمز المميز إلى المكدس3 4 2 × 1 5 − 2^ ^ ÷ +^ يتم تقييمها من اليمين إلى اليسار
3أضف الرمز المميز إلى المخرجات3 4 2 × 1 5 − 2 3^ ^ ÷ +
نهايةقم بإخراج جميع عناصر المكدس إلى المخرج.3 4 2 × 1 5 − 2 3 ^ ^ ÷ +

الإدخال: الخطيئة ( الحد الأقصى ( 2, 3 ) ÷ 3 × π )

رمز مميزفعلالناتج (بوحدة RPN )مكدس العملياتملحوظات
الخطيئةأضف الرمز المميز إلى المكدسالخطيئة
(أضف الرمز المميز إلى المكدس(الجيب)
الأعلىأضف الرمز المميز إلى المكدسأقصى (الجيب
(أضف الرمز المميز إلى المكدس( max ( sin
2أضف الرمز المميز إلى المخرجات2( max ( sin
،يتجاهل2( max ( sinالعامل الموجود في أعلى المكدس هو قوس مفتوح
3أضف الرمز المميز إلى المخرجات2 3( max ( sin
)قم بإزالة المكدس إلى المخرج2 3( max ( sinيُكرر حتى يصبح الرمز "(" في أعلى المكدس
كومة من البوب2 3أقصى (الجيبتجاهل الأقواس المتطابقة
قم بإزالة المكدس إلى المخرج2 3 كحد أقصى(الجيب)الوظيفة في أعلى المكدس
÷أضف الرمز المميز إلى المكدس2 3 كحد أقصى÷ ( sin
3أضف الرمز المميز إلى المخرجات2 3 كحد أقصى 3÷ ( sin
×قم بإزالة المكدس إلى المخرج2 3 كحد أقصى 3 ÷(الجيب)
أضف الرمز المميز إلى المكدس2 3 كحد أقصى 3 ÷× ( جا
πأضف الرمز المميز إلى المخرجات2 3 max 3 ÷ π× ( جا
)قم بإزالة المكدس إلى المخرج2 3 max 3 ÷ π ×(الجيب)يُكرر حتى يصبح الرمز "(" في أعلى المكدس
كومة من البوب2 3 max 3 ÷ π ×الخطيئةتجاهل الأقواس المتطابقة
قم بإزالة المكدس إلى المخرج2 3 max 3 ÷ π × sinالوظيفة في أعلى المكدس
نهايةقم بإخراج جميع عناصر المكدس إلى المخرج.2 3 max 3 ÷ π × sin

انظر أيضاً

مراجع

  1. ثيودور نورفيل (1999). "تحليل التعبيرات بالانحدار التكراري" . www.engr.mun.ca. تاريخ الاسترجاع: 28-12-2020 .
  2. ^ ديكسترا ، إدسجر (11/1961/01). "ترجمة Algol 60 : مترجم Algol 60 لجهاز X1 وعمل مترجم لـ Algol 60" . مؤسسة مركز الرياضيات .