71 lines
1.5 KiB
Ruby
71 lines
1.5 KiB
Ruby
require 'forwardable'
|
|
|
|
# A stack contains elements in last-in, first-out order.
|
|
# Stack#push adds new elements to the top of the stack;
|
|
# Stack#pop removes elements from the top.
|
|
class Stack
|
|
extend Forwardable
|
|
|
|
# Creates a Stack containing _objects_.
|
|
def self.[](*objects)
|
|
new.push(*objects)
|
|
end
|
|
|
|
# Creates an empty Stack.
|
|
def initialize
|
|
@ary = []
|
|
end
|
|
|
|
# Duplicates a Stack.
|
|
def initialize_copy(obj)
|
|
super
|
|
@ary = @ary.dup
|
|
end
|
|
|
|
# Adds each object to the top of this Stack. Returns self.
|
|
def push(*objects)
|
|
@ary.push(*objects)
|
|
self
|
|
end
|
|
alias << push
|
|
|
|
##
|
|
# :method: pop
|
|
# :call-seq:
|
|
# pop -> obj or nil
|
|
# pop(n) -> ary
|
|
#
|
|
# Removes an element from the top of this Stack, and returns it.
|
|
# Returns nil if the Stack is empty.
|
|
#
|
|
# If passing a number _n_, removes the top _n_ elements, and returns
|
|
# an Array of them. If this Stack contains fewer than _n_ elements,
|
|
# returns them all. If this Stack is empty, returns an empty Array.
|
|
def_delegator :@ary, :pop
|
|
|
|
##
|
|
# :method: top
|
|
# :call-seq:
|
|
# top -> obj or nil
|
|
# top(n) -> ary
|
|
# Returns the topmost element without modifying the stack.
|
|
def_delegator :@ary, :last, :top
|
|
|
|
##
|
|
# :method: empty?
|
|
# Returns true if this Stack contains no elements.
|
|
def_delegator :@ary, :empty?
|
|
|
|
##
|
|
# :method: size
|
|
# Returns the number of elements in this Stack.
|
|
def_delegator :@ary, :size
|
|
alias length size
|
|
|
|
# Converts this Stack to a String.
|
|
def to_s
|
|
"#{self.class}#{@ary.inspect}"
|
|
end
|
|
alias inspect to_s
|
|
end
|