diff --git a/lib/problems.rb b/lib/problems.rb index 5085953d..9b284664 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -1,13 +1,37 @@ require_relative './stack.rb' -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) +# Space Complexity: O(n) def balanced(string) - raise NotImplementedError, "Not implemented yet" + stack = Stack.new + twosomes = { + "[" => "]", + "(" => ")", + "{" => "}" + } + + string.each_char do |char| + if twosomes.values.include?(char) + return false if twosomes.key(char) != stack.pop + elsif twosomes.key?(char) + stack.push(char) + end + end end -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) +# Space Complexity: O(n) def evaluate_postfix(postfix_expression) - raise NotImplementedError, "Not implemented yet" + postfix_expression.each_char do |char| + if char.match(/\d/) + stack.push(char.to_i) + else + front = stack.pop + back = stack.pop + evaluation = #{front} #{char} #{back} + stack.push(evaluation.to_i) + end + end + + return stack.pop end diff --git a/lib/queue.rb b/lib/queue.rb index 828217c6..4dd48bb1 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,31 +1,67 @@ class Queue def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @queue = Array.new + @size = 20 + @front = -1 + @back = -1 end def enqueue(element) - raise NotImplementedError, "Not yet implemented" + if @front == -1 + @front = 0 + @queue[@front] = element + @back = 1 + elsif @front == @back + raise ArgumentError, "The queue is full; cannot enqueue at this time." + else + @queue[@back] = element + @back = (1 + @back) % @size + end end def dequeue - raise NotImplementedError, "Not yet implemented" + if @front == -1 + raise ArgumentError, "The queue is empty." + elsif @front == @back + interim = @queue[@front] + @front = -1 + @back = -1 + + return interim + else + interim = @queue[@front] + @front = (1 + @front) % @size + + return interim + end end def front - raise NotImplementedError, "Not yet implemented" + return @queue[@front] + end + + @private + def get_queue_contents() + if @queue.empty? + return [] + elsif @front > @back + return @queue[@front...@size] + @queue[0...@back] + else + return @queue[@front...@back] + end end def size - raise NotImplementedError, "Not yet implemented" + self.get_queue_contents.length end def empty? - raise NotImplementedError, "Not yet implemented" + return self.get_queue_contents.empty? end def to_s - return @store.to_s + return self.get_queue_contents.to_s end + end diff --git a/lib/stack.rb b/lib/stack.rb index cfc6ef0f..1cadf15b 100644 --- a/lib/stack.rb +++ b/lib/stack.rb @@ -1,22 +1,25 @@ class Stack def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @stack = LinkedList.new end def push(element) - raise NotImplementedError, "Not yet implemented" + @stack.add_front(element) end def pop - raise NotImplementedError, "Not yet implemented" + return nil if self.empty? + + element = stack.remove_front + + return element end def empty? - raise NotImplementedError, "Not yet implemented" + return @stack.empty? end def to_s - return @store.to_s + return @stack.to_s end end