Is there some advantage to filling a stack with nils and interpreting the "top" as the last non-nil value?
Posted
by
dwilbank
on Stack Overflow
See other posts from Stack Overflow
or by dwilbank
Published on 2013-10-26T15:34:22Z
Indexed on
2013/10/26
15:54 UTC
Read the original article
Hit count: 343
ruby
While working on a rubymonk exercise, I am asked to implement a stack with a hard size limit. It should return 'nil' if I try to push too many values, or if I try to pop an empty stack.
My solution is below, followed by their solution. Mine passes every test I can give it in my IDE, while it fails rubymonk's test. But that isn't my question.
Question is, why did they choose to fill the stack with nils instead of letting it shrink and grow like it does in my version?
It just makes their code more complex.
Here's my solution:
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
and here is the accepted answer
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
© Stack Overflow or respective owner