diff --git a/DIRECTORY.md b/DIRECTORY.md index 73f5b28..85e3f08 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -13,6 +13,8 @@ * Linked Lists * [Double List](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/linked_lists/double_list.rb) * [Single List](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/linked_lists/single_list.rb) + * Stacks + * [Stack](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/stacks/stack.rb) * Tries * [Trie](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/tries/trie.rb) diff --git a/data_structures/stacks/stack.rb b/data_structures/stacks/stack.rb new file mode 100644 index 0000000..c45283d --- /dev/null +++ b/data_structures/stacks/stack.rb @@ -0,0 +1,87 @@ +# A stack is an abstract data type that serves as a collection of +# elements with two principal operations: push() and pop(). push() adds an +# element to the top of the stack, and pop() removes an element from the top +# of a stack. The order in which elements come off of a stack are +# Last In, First Out (LIFO) + +class StackOverflowError < StandardError; end + +class Stack + def initialize(limit, stack = []) + @stack = stack + @limit = limit + end + + attr_accessor :stack, :limit + + def push(item) + raise StackOverflowError unless stack.count < limit + + stack << item + end + + def pop + stack.pop + end + + def peek + stack.last + end + + def empty? + stack.count.zero? + end + + def full? + stack.count == limit + end + + def size + stack.count + end + + def contains?(item) + stack.include?(item) + end +end + +stack = Stack.new(10, []) + +puts stack.empty? +# => true + +stack.push(3) +stack.push(5) +stack.push(7) +stack.push(9) + +puts stack.full? +# => false + +puts stack.contains?(5) +# => true + +puts stack.pop +# => 9 + +puts stack.peek +# => 7 + +puts stack.size +# => 3 + +puts stack.inspect +# => # + +stack.push(13) +stack.push(15) +stack.push(17) +stack.push(19) +stack.push(23) +stack.push(25) +stack.push(27) +# At this point, the stack is full + +stack.push(29) +# => data_structures/stacks/stack.rb:18:in `push': StackOverflowError (StackOverflowError) +# from data_structures/stacks/stack.rb:83:in `
'