تحويل تدوين infix إلى postfix

ما هو تدوين infix و postfix يمكن العثور عليه إذا قرأت بعناية على ويكيبيديا. هناك أيضا مقال عن حبري.

في هذه المقالة سوف أعرض خوارزمية بسيطة وواضحة لتحويل إدخالات infix إلى postfix. أقوم بتطبيق هذه الخوارزمية في لغة Kotlin ، على الرغم من أن الخوارزمية مناسبة لأي لغة برمجة.

حسنا تفضل.

لفهم وحفظ أفضل ، سنستخدم الاختصارات:

  1. المكدس - المكدس هو نوع بيانات ، وهو قائمة بالعناصر المنظمة وفقًا لمبدأ LIFO (جاء آخر عنصر - خرج الأول). دراسة أكثر تفصيلا هنا.
  2. QUEUE - قائمة الانتظار هي نوع بيانات ، وهي قائمة بالعناصر المنظمة وفقًا لمبدأ FIFO (يأتي أولاً ، يخرج أولاً). دراسة أكثر تفصيلا هنا.
  3. PUSH - دفع ، عند الدفع ، تتم إضافة عنصر جديد إلى أعلى المكدس ، أي أن العنصر الحالي يصبح أعلى المكدس (العنصر الأخير). يمكنك الدراسة بالتفصيل هنا
  4. POP - يقوم بإلغاء تحميل عنصر أعلى المكدس. الجزء العلوي هو العنصر الأخير على المكدس. يمكن العثور على مزيد من التفاصيل هنا .
  5. TOP - الجزء العلوي من المكدس ، أي العنصر الأخير

خوارزمية التحويل من infix إلى تعبير postfix
كرر فوق التعبير من اليسار إلى اليمين.

  1. , (QUEUE).
  2. (+, -, *, /) :

    • (STACK) (TOP), (PUSH) (STACK).
    • (TOP), (PUSH) (STACK).
    • , (TOP), POP (QUEUE), (TOP), (PUSH) (STACK).

  3. , (PUSH) (STACK).
  4. , (POP) (QUEUE), . (STACK).
  5. (POP) (QUEUE)

: 5*6+(2-9)
.
STACK = empty
QUEUE = empty

  • 5. .
    STACK = empty
    QUEUE = 5
  • *. .
    STACK = *
    QUEUE = 5
  • 6. .
    STACK = *
    QUEUE = 5, 6
  • +. , . , . .
    STACK = +
    QUEUE = 5, 6, *
  • (. .
    STACK = +, (
    QUEUE = 5, 6, *
  • 2. .
    STACK = +, (
    QUEUE = 5, 6, *, 2
  • . , "", "(". .
    STACK = +, (, —
    QUEUE = 5, 6, *, 2
  • 9 . .
    STACK = +, (, —
    QUEUE = 5, 6, *, 2, 9
  • ) . , . .
    STACK = +
    QUEUE = 5, 6, *, 2, 9, —
  • , .
    STACK = empty
    QUEUE = 5, 6, *, 2, 9, -, +

56*29-+.

خوارزمية للحصول على نتيجة من تعبير postfix
.

  1. , (PUSH) (STACK)
  2. (*-/+), (POP) (STACK) . (PUSH) (STACK).
  3. , (TOP) (STACK) .

: 56*29-+.

.

STACK = empty

  • 5. .
    STACK = 5
  • 6. .
    STACK = 5, 6
  • * . (5 * 6), , .
    STACK = 30
  • 2 . .
    STACK = 30, 2
  • 9 . .
    STACK = 30, 2, 9
  • . (2 — 9), , .
    STACK = 30, -7
  • + . (-7 + 30), , .
    STACK = 23

:

: 5*6+(2-9) = 23

: 56*29-+ = 23

على سبيل المثال ، نقوم بتنفيذها بلغة Kotlin
: 5*8*(2+9)+(7*5+8-9*(5*5)+5) = 263

  1. , expressionList: mutableListOf<String>()
    private var stack = mutableListOf<String>()
    private var queue = mutableListOf<String>()
    private var expressionList = mutableListOf<String>()
    
    fun main() {
        parseExpression()
    }
    
    fun parseExpression() {
        "5*8*(2+9)+(7-5+8-9*(5*5)+5)".forEach {
            expressionList.add(it.toString())
        }
        print(" : ")
        expressionList.forEach {
            print(it)
        }
        println()
    }
    


  2. private fun getPostFixEx() {
        //  expressionList
        expressionList.forEach {
            when {
                //      PUSH
                it == "(" -> push(it)
    
                //      POP
                it == ")" -> {
                    if (expressionList.contains("(")) {
                        pop()
                    }
                }
    
                //   ,    
                Regex("[\\d]").containsMatchIn(it) -> addQueue(it)
    
                //   +  -
                Regex("[+-]").containsMatchIn(it) ->
                    /* ,         ,
                    *   PUSH */
                    if (stack.isEmpty() || stack.last() == "(") push(it)
                    /* ,       
                    * ,   POP,  PUSH */
                    else if (stack.last().contains(Regex("[/*]"))) {
                        pop()
                        push(it)
                    }
                    //    PUSH
                    else {
                        addQueue(stack.last())
                        stack[stack.lastIndex] = it
                    }
    
                //   *  /
                Regex("[*/]").containsMatchIn(it) -> {
                    /* ,         ,
                    *   POP */
                    if (stack.isNotEmpty() && (stack.last() == "*" || stack.last() == "/")) {
                        pop()
                    }
                    //   PUSH
                    push(it)
                }
            }
        }
        //     ,       
        if (stack.isNotEmpty()) {
            for (i in stack.lastIndex downTo 0) {
                if (stack[i] != "(") {
                    addQueue(stack[i])
                }
            }
        }
        print(" : ")
        queue.forEach {
                print(it)
        }
        println()
    
    }
    
    private fun pop() {
        //         ,     
        Loop@ for (i in stack.lastIndex downTo 0) {
            if (stack[i] == "(") {
                stack[i] = " "
                break@Loop
            }
            addQueue(stack[i])
            stack[i] = " "
        }
        stack.removeIf { it == " " }
    }
    
    private fun addQueue(item: String) {
        queue.add(item)
    }
    
    private fun push(item: String) {
        stack.add(item)
    }
    


  3. private fun calcPostFix() {
        //   
        val stack = mutableListOf<Int>()
        //    
        for (item in queue) {
            when {
                //    - ,    
                Regex("[\\d]").containsMatchIn(item) -> {
                    stack.add(item.toInt())
                }
                /*    + ,    
                    */
                item == "+" -> {
                    stack[stack.lastIndex - 1] = stack[stack.lastIndex - 1] + stack.last()
                    stack.removeAt(stack.lastIndex)
                }
                /*    * ,    
                    */
                item == "*" -> {
                    stack[stack.lastIndex - 1] = stack[stack.lastIndex - 1] * stack.last()
                    stack.removeAt(stack.lastIndex)
                }
                /*    / ,    
                    */
                item == "/" -> {
                    stack[stack.lastIndex - 1] = stack[stack.lastIndex - 1] / stack.last()
                    stack.removeAt(stack.lastIndex)
                }
                /*    -,    
                     */
                item == "-" -> {
                    stack[stack.lastIndex - 1] = stack[stack.lastIndex - 1] - stack.last()
                    stack.removeAt(stack.lastIndex)
                }
            }
        }
    
        //  -  ,    
        println(": ${stack.first()}")
    }
    



:

: 5*8*(2+9)+(7-5+8-9*(5*5)+5)

: 58*29+*75-8+955**-5++

: 230

هذا كل شيء ، كل شيء بسيط وواضح.

All Articles