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