数组堆栈结构崩溃,弹出时EXC_BAD_INTRUCTION



我正在制作我的第一个 swift 结构,一个堆栈:

struct stack {
    var Innerarray = [Double]()
    var pointer=0
    mutating func push(val: Double) -> Double {
        self.Innerarray.append( (val))
        pointer+=1
        return val
    }
    mutating func pop() -> Double {
        return Innerarray[self.pointer]
    }
    init() {
        self.push(0)
    }
}

当一个做:

var test = stack()
test.push(1)

它有效。但是当我这样做时:

test.pop()

我收到一条相当神秘的错误消息:

执行中断,原因:EXC_BAD_INTRUCTION(代码=EXC_1386_INVOP,子代码=0x0)

你的数组索引超出了范围。 在使用它来索引内部数组之前,您需要递减pointer

mutating func pop() -> Double {
    pointer -= 1
    return Innerarray[self.pointer]
}

您还应该考虑当数组为空时该怎么做。 也许pop应该返回一个Double?,如果堆栈为空,则返回nil

您还应该从内部数组中删除最后一个元素,否则下一个push将无法正常工作。 数组方法removeLast()可以派上用场,因为它从数组中删除最后一项并返回它。

如果出于某种原因确实必须手动使用指针,那么在返回指针时应该得到减一(或将初始指针设置为 -1),因为数组索引从零开始。

return Innerarray[self.pointer - 1]

实际上,您可以使用 .last 返回最后一个元素,而不是使用手动指针:

return Innerarray.last!

最新更新