diff --git a/lib/problems.rb b/lib/problems.rb index 5085953d..9bf62535 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -1,13 +1,74 @@ +# frozen_string_literal: true + require_relative './stack.rb' -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) +# # Space Complexity: O(n) +# def balanced(string) +# opening_brackets = Stack.new +# # string.each_char do |char| +# # # if an opening bracket, push it into the opening_brackets +# # if char == '{' || char == '(' || char == '[' +# # opening_brackets.push(char) +# # else + +# # compare if the last opening bracket matches with the current closing bracket in char +# opening_bracket = opening_brackets.pop() +# if matching_braces == '}' && opening_bracket != '{' +# return false +# elsif matching_braces == ')' && opening_bracket != '(' +# return false +# elsif matching_braces == ']' && opening_bracket != '[' +# return false +# end + +# # if everything matches/closes, then we have a balanced brackets +# return opening_brackets.empty? +# end + def balanced(string) - raise NotImplementedError, "Not implemented yet" + matching_hash = { + '{' => '}', + '(' => ')', + '[' => ']' + } + matching_stacks = Stack.new + + string.each_char do |char| + if matching_hash.key? char + matching_stacks.push(char) + elsif matching_hash.value? char + closing_brace = matching_hash[matching_stacks.pop] + return false if closing_brace != char + end + end + matching_stacks.empty? end -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) +# Space Complexity: O(n) def evaluate_postfix(postfix_expression) - raise NotImplementedError, "Not implemented yet" + operands = Stack.new + postfix_expression.each_char do |char| + if char != '+' && char != '*' && char != '-' && char != '/' + operands.push(char) + else # if not pop 2 values + y = operands.pop.to_i + x = operands.pop.to_i + result = 0 + + if char == '+' + result = x + y + elsif char == '*' + result = x * y + elsif char == '-' + result = x - y + elsif char == '/' + result = x / y + end + + operands.push(result) + end + end + operands.pop end diff --git a/lib/queue.rb b/lib/queue.rb index 828217c6..b7643c4c 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,31 +1,45 @@ -class Queue +# frozen_string_literal: true - def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" +class Queue + def initialize(size = 30) + @store = [] + @size = size + @front = 0 + @back = 0 end def enqueue(element) - raise NotImplementedError, "Not yet implemented" - end - - def dequeue - raise NotImplementedError, "Not yet implemented" + if @front == (@back + 1) % @size + raise StandardError, 'Queue is full.' + else + @store[@back] = element + @back = (@back + 1) % @size + end end - def front - raise NotImplementedError, "Not yet implemented" + def empty? + @front == @back # front & back are pointing to the same position, then we've read everything end - def size - raise NotImplementedError, "Not yet implemented" - end + def dequeue + return nil if empty? - def empty? - raise NotImplementedError, "Not yet implemented" + element = @store[@front] + @front = (@front + 1) % @size # advance the front pointer/index by 1 + element end def to_s - return @store.to_s + return [] if empty? + + queue = [] + current = @front + + while current != @back + queue << @store[current] + current = (current + 1) % @size + end + + queue.to_s end end diff --git a/lib/stack.rb b/lib/stack.rb index cfc6ef0f..48c432c4 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" + def pop() + return nil if self.empty? + + element = @store.remove_first + + return element end - def empty? - raise NotImplementedError, "Not yet implemented" + def empty?() + return @store.empty? end def to_s diff --git a/test/problems_test.rb b/test/problems_test.rb index 046f059e..7467bcad 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 @@ -36,20 +36,20 @@ describe "postfix" do it "can add a 2 numbers together" do - expect(evaluate_postfix("34+")).must_equal 7 - expect(evaluate_postfix("34*")).must_equal 12 - expect(evaluate_postfix("34-")).must_equal(-1) - expect(evaluate_postfix("34/")).must_equal 0 + expect(evaluate_postfix('34+')).must_equal 7 + expect(evaluate_postfix('34*')).must_equal 12 + expect(evaluate_postfix('34-')).must_equal(-1) + expect(evaluate_postfix('34/')).must_equal 0 end it "can add a evaluate a more complicated expression" do - expect(evaluate_postfix("34+2*")).must_equal 14 - expect(evaluate_postfix("34*2/")).must_equal 6 - expect(evaluate_postfix("34-1+")).must_equal 0 - expect(evaluate_postfix("34/7-")).must_equal(-7) - expect(evaluate_postfix("35+6*")).must_equal 48 - expect(evaluate_postfix("62/5+")).must_equal 8 + expect(evaluate_postfix('34+2*')).must_equal 14 + expect(evaluate_postfix('34*2/')).must_equal 6 + expect(evaluate_postfix('34-1+')).must_equal 0 + expect(evaluate_postfix('34/7-')).must_equal(-7) + expect(evaluate_postfix('35+6*')).must_equal 48 + expect(evaluate_postfix('62/5+')).must_equal 8 end end end \ No newline at end of file diff --git a/test/stack_test.rb b/test/stack_test.rb index cb15a12c..7c0fa755 100644 --- a/test/stack_test.rb +++ b/test/stack_test.rb @@ -9,6 +9,7 @@ it "pushes something onto a empty Stack" do s = Stack.new s.push(10) + s.empty?.must_equal false expect(s.pop).must_equal 10 end 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