在进行rubymonk练习时,我被要求实现一个具有硬大小限制的堆栈。如果我尝试推送太多值,或者我尝试弹出一个空堆栈,它应该返回“nil”。
我的解决方案如下,然后是他们的解决方案。我的通过了我可以在我的 IDE 中提供的所有测试,而它没有通过 rubymonk 的测试。但这不是我的问题。
问题是,为什么他们选择用 nil 填充堆栈,而不是像我的版本那样让它收缩和增长?
它只会使他们的代码更复杂。
这是我的解决方案:
class Stack
def initialize(size)
@max = size
@store = Array.new
end
def pop
empty? ? nil : @store.pop
end
def push(element)
return nil if full?
@store.push(element)
end
def size
@store.size
end
def look
@store.last
end
private
def full?
@store.size == @max
end
def empty?
@store.size == 0
end
end
这是公认的答案
class Stack
def initialize(size)
@size = size
@store = Array.new(@size)
@top = -1
end
def pop
if empty?
nil
else
popped = @store[@top]
@store[@top] = nil
@top = @top.pred
popped
end
end
def push(element)
if full? or element.nil?
nil
else
@top = @top.succ
@store[@top] = element
self
end
end
def size
@size
end
def look
@store[@top]
end
private
def full?
@top == (@size - 1)
end
def empty?
@top == -1
end
end