Как решить для вложенных скобок Swift - PullRequest
0 голосов
/ 09 октября 2019

Я сейчас работаю над приложением научного калькулятора (я занимаюсь этим как хобби). Я работал с кнопками круглых скобок, и логикой этого, и сумел это сделать. Но я попытался сделать вложенные скобки с функциями, которые являются рекурсивными, но не могут это сделать и заставить это произойти. Итак, мне было интересно, есть ли какой-либо тип алгоритма для вложенных скобок? Любая помощь будет оценена!

Вот мой код прямо сейчас (пожалуйста, не берите в голову длину, я новичок в этом), это также просто функция:

func nestedParens(){
    used = false
    asneeded03 = false

    repeat{
        Stack_size.push(_element: 0)
        asneeded02 = false
        asneeded05 = false
        addrtract = ""
        if stackSize04 >= 0{
            addrtract = operators02.pop()!
            stackSize04 = stackSize04 - 1
        }
        if stackSize04 >= 1{
            if addrtract == "÷" || addrtract == "x"{
                addrtract03 = addrtract
                addrtract = operators02.pop()!
                stackSize04 = stackSize04 - 1

                if addrtract == "("{
                    NparStackS.push(_element: addrtract03)
                    Nvar = "\(parNumber)"
                    operators02.push(_element: Nvar)
                    stackSize04 = stackSize04 + 1
                    numberOne = operands02.pop()!
                    adrtrctStack.push(_element: numberOne)

                    stackSize02 = stackSize02 - 1
                }else if addrtract != "("{
                    operators02.push(_element: addrtract)
                    stackSize04 = stackSize04 + 1
                    addrtract = addrtract03
                }
            }
        }
        ISAI = isStringAnInt(string: addrtract)

        if ISAI == true {
            AnsInt = Int(addrtract)!


            if parNumber == AnsInt{
                addrtract = NparStackS.pop()!
                stackSize04 = stackSize04 - 1
                asneeded05 = true
            }else{
                addrtract = operators02.pop()!
                Nvar = "\(AnsInt)"
                operators02.push(_element: Nvar)
            }
        }

        if addrtract == "÷" || addrtract == "x"{
            if asneeded05 == false{
                if used == false{
                    numberOne = operands02.pop()!
                    stackSize02 = stackSize02 - 1
                }else if used == true{
                    numberOne = parStackOD.pop()!
                    Stack_size.pop()
                }
                numberTwo = operands02.pop()!
                stackSize02 = stackSize02 - 1
            }else if asneeded05 == true{
                numberOne = adrtrctStack.pop()!
                numberTwo = parStackOD.pop()!
                Stack_size.pop()
            }
            if addrtract == "÷" {
                semiAns = numberOne / numberTwo
            }else if addrtract == "x"{
                semiAns = numberOne * numberTwo
            }

            addrtract = operators02.pop()!
            stackSize04 = stackSize04 - 1
            if addrtract == ")"{

            }else if addrtract != ")"{
                operators02.push(_element: addrtract)
                stackSize04 = stackSize04 + 1
                addrtract = ""
            }
            Stack_size.push(_element: 1)
            stackNumber = semiAns
            parStackOD.push(_element: stackNumber)

            used = true
        }else if addrtract == "+" || addrtract == "-" {
            if used == true{
                numberOne = parStackOD.pop()!
            }else if used == false{
                numberOne = operands02.pop()!
                stackSize02 = stackSize02 - 1
                Stack_size.push(_element: 1)
            }
            stackNumber = numberOne
            parStackOT.push(_element: addrtract)
            parStackOD.push(_element: stackNumber)
            asneeded03 = true

            addrtract = operators02.pop()!
            stackSize04 = stackSize04 - 1
            if addrtract == ")"{
                numberOne = operands02.pop()!
                parStackOD.push(_element: numberOne)
                stackSize02 = stackSize02 - 1
                Stack_size.push(_element: 1)
            }else if addrtract != ")"{
                operators02.push(_element: addrtract)
                stackSize04 = stackSize04 + 1
                addrtract = ""
            }
            used = false
        }else if addrtract == "("{
            if used == false{
                usedStack.push(_element: "false")
            }else if used == true{
                usedStack.push(_element: "true")
            }
            used = false
            if asneeded03 == false{
                usedStack.push(_element: "false")
            }else if asneeded03 == true{
                usedStack.push(_element: "true")
            }
            asneeded03 = false
            parNumber = parNumber + 1
            nestedParens()
            parNumber = parNumber - 1
            addrtract = usedStack.pop()!
            if addrtract == "true"{
                asneeded03 = true
            }else if addrtract == "false"{
                asneeded03 = false
            }
            addrtract = usedStack.pop()!
            if addrtract == "true"{
                used = true
            }else if addrtract == "false"{
                used = false
            }

            addrtract = ""
        }

        if addrtract == ")"{

            if asneeded03 == false{
                numberOne = Stack_size.pop()!
            }
            if asneeded03 == true{
                used02 = false
                repeat{
                    //varia = varia + 1
                    addrtract = parStackOT.pop()!
                    numberOne = parStackOD.pop()!
                    Stack_size.pop()

                    if addrtract == "+"{
                        numberTwo = parStackOD.pop()!
                        Stack_size.pop()
                        semiAns = numberOne + numberTwo
                    }else if addrtract == "-"{
                        numberTwo = parStackOD.pop()!
                        Stack_size.pop()
                        semiAns = numberTwo - numberOne
                    }
                    stackNumber = semiAns
                    parStackOD.push(_element: stackNumber)

                    numberOne = Stack_size.pop()!
                    if numberOne == 0{
                        used02 = true
                    }else if numberOne == 1{
                        Stack_size.push(_element: 1)
                    }

                    Stack_size.push(_element: 1)
                }while used02 == false
                Stack_size.pop()
            }else if numberOne == 0{
                numberOne = operands02.pop()!
                stackSize02 = stackSize02 - 1

                parStackOD.push(_element: stackNumber)
            }else{
            }
            asneeded02 = true
        }
    }while(asneeded02 != true)
    addrtract = ""
}
...