You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:31:34