عند كتابة التعليمات البرمجية ، نواجه أحيانًا مواقف نحتاج فيها إلى تحليل التعبيرات الحسابية الأربعة بأنفسنا. تقدم هذه المقالة باختصار استخدام JavaScript لتنفيذ تحليل التعبيرات الحسابية الأربعة البسيطة.
1. على دراية بالمفهوم
تدوين INFIX (أو تدوين Infix) هو طريقة تمثيل صيغة حسابي أو منطقية عامة. المشغل في منتصف المعامل في شكل infix (مثال: 3 + 4). وهذا هو ، نحن نستخدم التعبيرات الحسابية الأكثر شيوعا. تعبيرات Infix أسهل على البشر لفهمها ، ولكن ليس من السهل على تحليل الكمبيوتر.
الترميز البولندي العكسي (RPN ، أو التدوين البولندي العكسي) هو طريقة تعبير رياضي قدمه عالم الرياضيات البولندي جان فوكسفيتش في عام 1920. التدوين البولندي العكسي لا يتطلب أقواس لتحديد أولوية المشغل. من السهل استخدام تدوين البولندية العكسية لإنشاء مكدس لتحليل التعبير وحساب التعبير ، لذلك نحن هنا نحلّم تعبيرات العناصر الأربعة ، والتي تتحول أولاً من تعبير Infix إلى التعبير البولندي العكسي. ثم حساب القيمة.
2. عملية التحويل
تحويل تعبير Infix إلى تعبير لاحقة (جدولة خوارزمية حقل)
1. أدخل قائمة الانتظار ووقفت علامة
2. إذا كانت العلامة رقمًا ، فأضفها إلى قائمة انتظار الإخراج
3. إذا كان مشغل (+-*/) ، قارنه مع المشغل في الجزء العلوي من المكدس في مكدس الإخراج. إذا كانت الأولوية أقل من أو تساوي المشغل في الجزء العلوي من المكدس ، فافعل المشغل في الجزء العلوي من المكدس وأضفه إلى قائمة انتظار الإخراج (حلقة حتى لا يتم استيفاء الشروط المذكورة أعلاه) ، وأخيراً دفع المشغل إلى المكدس.
4. إذا كانت قوسًا يسارًا ، ادفعها إلى المكدس
5. إذا كانت شريحة قريبة ، فإن المشغل يخرج باستمرار من المكدس ويضاف إلى قائمة انتظار الإخراج ، ويعرف أن العنصر الموجود في الجزء العلوي من المكدس هو الشريحة اليسرى. تنبثق الدعامة اليسرى ولا تضيف قائمة انتظار الإخراج. إذا لم يتم العثور على شريحة يسارية ، فهذا يعني أن الأقواس في التعبير الأصلي غير متماثل وهناك خطأ.
6. إذا كانت قائمة انتظار الإدخال فارغة ولا يزال هناك عوامل في المكدس ، إذا تم ترك المشغل في الجزء العلوي من المكدس ، فهذا يعني أن التعبير الأصلي يحتوي على أقواس غير متطابقة. قم بإطفاء المشغلين في المكدس واحدًا تلو الآخر وإضافتها إلى قائمة انتظار الإخراج.
7. الانتهاء
3. تحويل تنفيذ الرمز
الدالة isOPerator (value) {var varactorstring = "+-*/()" ؛ return formatorstring.indexof (value)> -1} وظيفة getPrioraty (value) {switch (value) {case '+': case '-': case 1 ؛ case '*'/': return 2 ؛ default: return 0 ؛}}}}} getPrioraty (O2) ؛} دالة dal2rpn (exp) {var inputStack = [] ؛ var outputStack = [] ؛ var outputqueue = [] ؛ for (var i = 0 ، len = exp.length ؛ i <len ؛ i ++) {var cur = exp [i] ؛ if (cur! = '') بينما (inputStack.length> 0) {var cur = inputStack.shift () ؛ if (isOperator (cur)) {if (cur == '(') {outputstack.push (cur) ؛} else (cur == ')') {var po = outputstack.pop () ؛ بينما (po! = '(' && outputstack.length> 0) {outputequeue.push (po) ؛ po = outputstack.pop () ؛} if (po! = '(' (') {throw "error: unfatched ()" 0. == '(') {رمي "خطأ: unfatched ()" ؛} بينما (outputStack.length> 0) {outputQueue.push (outputStack.pop ()) ؛}} console.log ('Step Three') ؛ return outputQueue ؛} console.log (dal2rpn ('1 + 2') ؛ 3 ')) ؛ console.log (dal2rpn (' 1 + 2 * 3 ')) ؛ console.log (dal2rpn (' 1 + 2 * 3 - 4/5 ')) ؛ console.log (dal2rpn (' (1 + 2)) 5 ')) ؛ console.log (dal2rpn (' (1 + 2) * ((3 - 4) / 5) ') ؛4. تقييم التعبير البولندي العكسي
1. منبثقة علامة من قائمة انتظار الإدخال
2. إذا كان معاملًا ، أضفه إلى مكدس الإخراج
3. إذا كان مشغلًا ، فقم ببوب اثنين من المعاملات من مكدس الإخراج وحساب ، وادفع القيمة المحسوبة في مكدس الإخراج.
4. تشغيل الحلقة. إذا كانت قائمة انتظار الإدخال فارغة وكان هناك رقم واحد فقط على مكدس الإخراج ، فإن هذا الرقم هو النتيجة ، وإلا سيكون هناك معامل غير ضروري.
5. حساب الرمز
الوظيفة evalrpn (rpnqueue) {var outputStack = [] ؛ بينما (rpnqueue.length> 0) {var cur = rpnqueue.shift () ؛ if (! isOperator (cur)) {outputstack.push (cur) ؛ outputstack.pop () ؛ outputstack.push (getResult (fir ، sec ، cur)) ؛}} if (outputStack.6. الخلاصة
لا يتم استخدام التمثيل البولندي العكسي له عند الاتصال به لأول مرة ، ولكن بعد التعرف عليه ، ستجد أن الفكرة بسيطة للغاية في الواقع ، على عكس تمثيل Infix ، الذي له أولويات مختلفة ، وهناك قوسين ، وهي منطق مزعج بشكل خاص. التمثيل البولندي العكسي موجز نسبيًا ، وليس هناك حاجة للنظر في الأولوية على الإطلاق ، وليس هناك حاجة لاستخدام الأقواس والأقواس والأقواس لتعطيل الموقف.