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

时间:2016-05-22 19:07:10

标签: 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)

2 个答案:

答案 0 :(得分:2)

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

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

您还应该考虑在数组为空时要执行的操作。如果堆栈为空,pop可能会返回Double?并返回nil

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

答案 1 :(得分:0)

如果由于某种原因你真的必须手动使用指针,那么当你返回它时应该得到减1(或者将初始指针设置为-1),因为数组索引从零开始。

return Innerarray[self.pointer - 1]

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

return Innerarray.last!