Я сейчас работаю над приложением научного калькулятора (я занимаюсь этим как хобби). Я работал с кнопками круглых скобок, и логикой этого, и сумел это сделать. Но я попытался сделать вложенные скобки с функциями, которые являются рекурсивными, но не могут это сделать и заставить это произойти. Итак, мне было интересно, есть ли какой-либо тип алгоритма для вложенных скобок? Любая помощь будет оценена!
Вот мой код прямо сейчас (пожалуйста, не берите в голову длину, я новичок в этом), это также просто функция:
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 = ""
}