diff --git a/lib/problems.rb b/lib/problems.rb index 5085953d..1a0d5677 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -1,9 +1,33 @@ require_relative './stack.rb' -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n), where n is the length of the string +# Space Complexity: O(n) def balanced(string) - raise NotImplementedError, "Not implemented yet" + # base case: length of the expression must be even + return false if string.length.odd? + + # create a new stack + stack = Stack.new + + # loop through each char in the string + string.each_char do |char| + # if current char is an opening brace, push the corresponding closing brace to the stack. + if char == "(" + stack.push(")") + elsif char == "{" + stack.push("}") + elsif char == "[" + stack.push("]") + # if current char is the same as the last inserted char on stack, remove last inserted char + elsif !stack.empty? && stack.top == char + stack.pop + else # if stack is empty or last inserted char is not an opening brace + return false + end + end + + # string is balanced only if stack is empty at this point + return stack.empty? end # Time Complexity: ? diff --git a/lib/queue.rb b/lib/queue.rb index 828217c6..97090c60 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,31 +1,64 @@ class Queue def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @store = Array.new(20) + @size = 20 + @front = -1 + @rear = -1 end def enqueue(element) - raise NotImplementedError, "Not yet implemented" + if (@front == 0 && @rear == @size - 1) || + (@rear == (@front - 1) % (@size - 1)) + raise RuntimeError.new("Error: Queue is full") + elsif @front == -1 # queue is empty + @front = @rear = 0 + @store[@rear] = element + elsif @rear == @size - 1 && @front != 0 # rear needs to wrap around + @rear = 0 + @store[@rear] = element + else + @rear += 1 + @store[@rear] = element + end end def dequeue - raise NotImplementedError, "Not yet implemented" - end - - def front - raise NotImplementedError, "Not yet implemented" - end - - def size - raise NotImplementedError, "Not yet implemented" + if @front == -1 + raise RuntimeError.new("Error: The queue is empty") + end + + data = @store[@front] + @store[@front] = nil # overwrite the element being deleted + + if @front == @rear # queue is now empty + @front = @rear = -1 + elsif @front == @size - 1 # front needs to wrap around + @front = 0 + else + @front += 1 + end + + return data end def empty? - raise NotImplementedError, "Not yet implemented" + return @front == @rear end def to_s - return @store.to_s + list = Array.new + + @store[@front...@size].each do |element| + list.push(element) if element + end + + if @rear < @front # the queue has wrapped around + @store[0..@rear].each do |element| + list.push(element) if element + end + end + + return list.to_s end end diff --git a/lib/stack.rb b/lib/stack.rb index cfc6ef0f..41d89fe7 100644 --- a/lib/stack.rb +++ b/lib/stack.rb @@ -1,19 +1,22 @@ 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" + @store.remove_first end def empty? - raise NotImplementedError, "Not yet implemented" + @store.empty? + end + + def top + @store.get_first 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..f9340080 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -10,4 +10,4 @@ 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