iOS数据结构应用前缀/中缀/后缀转换逻辑错误排查求助
修复iOS表达式转换应用的逻辑错误
我仔细检查了你的代码,找到了几个关键问题,正是这些问题导致除中缀转前缀/后缀之外的转换功能出现偏差。下面逐个说明问题所在,并给出对应的修复方案:
1. 栈类型与调用不匹配
你定义的栈结构体是Stack1<T>,但代码中实例化的是var s = Stack<String>(),同时所有栈的方法调用也存在两处错误:
Stack1的isEmpty是属性,不是方法,你却写成了s.isEmpty()Stack1提供的是top属性获取栈顶元素,你却用了不存在的s.peek()方法
修复:
首先修正栈的实例化:
var s = Stack1<String>() // 将Stack改为Stack1
然后把所有栈相关的错误调用替换:
- 把所有
s.isEmpty()改为s.isEmpty - 把所有
s.peek()改为s.top
2. prefixToPostfix函数的循环范围与结果拼接错误
当前函数的循环跳过了第一个字符(索引0),而且循环结束后错误地拼接栈中所有元素,导致结果重复或缺失。
修复后的代码:
func prefixToPostfix(exp : String) -> String { var op1 = String() var op2 = String() // 修复循环范围,遍历所有字符(从最后一个到第一个) for i in stride(from: exp.count-1, through: 0, by: -1) { let c = exp.getCharAtIndex(i) if Prec1(c: c) { op1 = s.pop()! op2 = s.pop()! let temp = op2 + op1 + String(c) s.push(temp) } else { s.push(String(c)) } } // 栈中只剩最终结果,直接弹出返回 guard let result = s.pop() else { return "Invalid Expression" } return result }
3. PostfixToPrefix函数的循环范围与逻辑错误
这个函数存在两个核心问题:
- 循环跳过了最后一个字符,导致运算符或操作数缺失
- 遇到运算符时,错误地将操作数放在运算符前面,导致结果顺序完全颠倒
修复后的代码:
func PostfixToPrefix(exp : String) -> String { var op1 = String() var op2 = String() // 修复循环范围,遍历所有字符 for i in 0..<exp.count { let c = exp.getCharAtIndex(i) if Prec1(c: c) { op1 = s.pop()! op2 = s.pop()! // 正确逻辑:运算符在前,左操作数次之,右操作数最后 let temp = String(c) + op2 + op1 s.push(temp) } else { s.push(String(c)) } } // 栈中只剩最终结果,直接弹出返回 guard let result = s.pop() else { return "Invalid Expression" } return result }
4. 前缀转中缀的逻辑优化
你当前实现前缀转中缀的方式(反转+替换括号+转后缀+反转)容易引入括号错误,建议改用栈直接实现,逻辑更清晰:
// 新增前缀转中缀函数 func prefixToInfix(exp: String) -> String { var stack = Stack1<String>() for i in stride(from: exp.count-1, through: 0, by: -1) { let c = exp.getCharAtIndex(i) if Prec1(c: c) { let op1 = stack.pop()! let op2 = stack.pop()! let temp = "(" + op1 + String(c) + op2 + ")" stack.push(temp) } else { stack.push(String(c)) } } guard let result = stack.pop() else { return "Invalid Expression" } return result }
然后在转换逻辑中替换原有的前缀转中缀代码:
if to_lbl.text == "Infix" && from_lbl.text == "Prefix" { answer_lbl.text = prefixToInfix(exp: input) btnSave.isHidden = false }
额外建议
- 在所有弹出栈的操作前添加空判断,避免强制解包导致崩溃(比如用
guard let或if let) - 统一函数命名风格(比如
PostfixToPrefix改为postfixToPrefix,符合Swift命名规范)
按照以上方案修复后,所有表达式转换功能应该都能正常工作了。
内容的提问来源于stack exchange,提问作者Mihir
相关产品推荐
相关产品推荐

