рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдХреЗрддрди рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ рдмрджрд▓реЗрдВ

рдХреНрдпрд╛ рд╣реИ рдЗрдиреНрдлрд╝рд┐рдХреНрд╕ рд╕рдВрдХреЗрддрди рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдЕрдВрдХрди рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рд╕реЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдкрдврд╝ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣реИрдмреЗ рдкрд░ рдПрдХ рд▓реЗрдЦ рднреА рд╣реИ ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬреЛ рдХрд┐ рдЗрдиреНрдлрд┐рдХреНрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ред рдореИрдВ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХреЛрдЯрд▓рд┐рди рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред

рдЦреИрд░, рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рдмреЗрд╣рддрд░ рд╕рдордЭ рдФрд░ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрдХреНрд╖рд┐рдкреНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

  1. рд╕реНрдЯреИрдХ - рдПрдХ рд╕реНрдЯреИрдХ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреЛ рдПрд▓рдЖрдИрдПрдлрдУ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрдпреЛрдЬрд┐рдд рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ (рдкрд┐рдЫрд▓реЗ рдПрдХ рдореЗрдВ рдЖрдпрд╛ рдерд╛ - рдкрд╣рд▓рд╛ рд╡рд╛рд▓рд╛ рдмрд╛рд╣рд░ рдЖрдпрд╛ рдерд╛)ред рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЕрдзреНрдпрдпрди рдпрд╣рд╛рдБред
  2. рдкреНрд░рд╢реНрди - рдПрдХ рдХрддрд╛рд░ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреЛ рдПрдлрдЖрдИрдПрдлрдУ рд╕рд┐рджреНрдзрд╛рдВрдд (рдкрд╣рд▓реЗ рдЖрдУ, рдкрд╣рд▓реЗ рдкрд╛рдУ) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдЧрдард┐рдд рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдпрд╣рд╛рдБ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЕрдзреНрдпрдпрди ред
  3. PUSH - рдзрдХреНрдХрд╛, рдЬрдм рдзрдХреНрдХрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдирдпрд╛ рддрддреНрд╡ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ (рдЕрдВрддрд┐рдо рддрддреНрд╡) рдмрди рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдпрд╣рд╛рдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  4. рдкреАрдУрдкреА - рдПрдХ рддрддреНрд╡ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдХреЗ рдКрдкрд░ рд╣реЛрддрд╛ рд╣реИред рд╢реАрд░реНрд╖ рд╕реНрдЯреИрдХ рдкрд░ рдЕрдВрддрд┐рдо рдЖрдЗрдЯрдо рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
  5. рд╢реАрд░реНрд╖ - рдвреЗрд░ рдХрд╛ рд╢реАрд░реНрд╖, рдЕрд░реНрдерд╛рддреН, рдЗрд╕рдХрд╛ рдЕрдВрддрд┐рдо рддрддреНрд╡

рд░реВрдкрд╛рдВрддрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо infix рд╕реЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рддрдХ
.

  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-+.

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдердо
.

  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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЛрдЯрд▓рд┐рди рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
: 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