61 lines
887 B
Crystal
61 lines
887 B
Crystal
module Lifo
|
|
class Stack(T) < LifoLike(T)
|
|
def initialize(capacity = -1)
|
|
super(capacity)
|
|
end
|
|
|
|
def push(e : T) : Int32
|
|
if @capacity == -1 || size < @capacity
|
|
@data << e
|
|
|
|
size
|
|
else
|
|
raise OverflowError.new
|
|
end
|
|
end
|
|
|
|
def push?(e : T) : Int32?
|
|
begin
|
|
push(e)
|
|
rescue OverflowError
|
|
nil
|
|
end
|
|
end
|
|
|
|
def pop : T
|
|
begin
|
|
res = @data.last
|
|
@data.pop
|
|
rescue IndexError
|
|
raise UnderflowError.new
|
|
end
|
|
|
|
res
|
|
end
|
|
|
|
def pop? : T?
|
|
begin
|
|
pop
|
|
rescue UnderflowError
|
|
nil
|
|
end
|
|
end
|
|
|
|
def peek : T
|
|
begin
|
|
@data.last
|
|
rescue IndexError
|
|
raise UnderflowError.new
|
|
end
|
|
end
|
|
|
|
def peek? : T?
|
|
begin
|
|
peek
|
|
rescue UnderflowError
|
|
nil
|
|
end
|
|
end
|
|
end
|
|
end
|