diff --git a/lib/problems.rb b/lib/problems.rb index 5085953d..83778701 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -1,13 +1,27 @@ require_relative './stack.rb' -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) +# Space Complexity: O(n) def balanced(string) - raise NotImplementedError, "Not implemented yet" + return false if string.length.odd? + brackets = {"{" => "}", "[" => "]", "(" => ")"} + bracket_stack = Stack.new + # for each char, if bracket, push it into stack + string.chars.each do |char| + if brackets[char] + bracket_stack.push(brackets[char]) + else # pop last item, see if it matches char, and if not return false + if bracket_stack.pop != char + return false + end + end + end + return bracket_stack.empty? # must be empty to return true end # Time Complexity: ? # Space Complexity: ? def evaluate_postfix(postfix_expression) raise NotImplementedError, "Not implemented yet" + # new stack end diff --git a/lib/queue.rb b/lib/queue.rb index 828217c6..8a059dbf 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,31 +1,50 @@ -class Queue - +class Queue # FIFO; Elements added to the rear and removed from front +# An Abstract Data Type is a data type with a specific public interface, but unspecified implementation. def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @store = Array.new(20) + @size = 20 + @front = 0 + @back = 0 + end - def enqueue(element) - raise NotImplementedError, "Not yet implemented" + def enqueue(element) # add an element to the rear of the queue + if @front == (@back + 1) % size + raise ArgumentError, "Queue is full" + else # move back to next position clockwise + @store[@back] = element + @back = (@back + 1) % @size + end end - def dequeue - raise NotImplementedError, "Not yet implemented" + def dequeue # Remove & return the element from the front + if @front == @back + raise ArgumentError, "Queue is empty" + else # move front to next position clockwise + result = @store[@front] + @front = (@front + 1) % @size + return result + end end def front - raise NotImplementedError, "Not yet implemented" + return @store[@front] end def size - raise NotImplementedError, "Not yet implemented" + return @store.size end def empty? - raise NotImplementedError, "Not yet implemented" + return @front == @back end def to_s - return @store.to_s + result = [] + @store.each do |element| + result << element if element + end + return result.to_s end + end diff --git a/lib/stack.rb b/lib/stack.rb index cfc6ef0f..0a0c2fb7 100644 --- a/lib/stack.rb +++ b/lib/stack.rb @@ -1,19 +1,19 @@ class Stack def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @store = LinkedList.new end def push(element) - raise NotImplementedError, "Not yet implemented" + @store.add_first(element) end def pop - raise NotImplementedError, "Not yet implemented" + return nil if self.empty? + @store.remove_first() end def empty? - raise NotImplementedError, "Not yet implemented" + @store.empty? end def to_s diff --git a/test/problems_test.rb b/test/problems_test.rb index 046f059e..694262b8 100644 --- a/test/problems_test.rb +++ b/test/problems_test.rb @@ -2,7 +2,7 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -xdescribe "Test wave 3 problems" do +describe "Test wave 3 problems" do describe "balanced" do it "Given balanced strings it should return true" do @@ -33,7 +33,7 @@ end end - describe "postfix" do + xdescribe "postfix" do it "can add a 2 numbers together" do expect(evaluate_postfix("34+")).must_equal 7 diff --git a/test/test_helper.rb b/test/test_helper.rb index 426168c8..6dfc6980 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,5 +9,4 @@ require_relative "../lib/linked_list.rb" require_relative "../lib/queue.rb" require_relative "../lib/stack.rb" -# Extra exercises -# require_relative "../lib/problems.rb" \ No newline at end of file +require_relative "../lib/problems.rb" \ No newline at end of file