From e0bbf69b4717ed7c9192b92c3055710220d5dee8 Mon Sep 17 00:00:00 2001 From: Emily Vomacka Date: Mon, 2 Mar 2020 22:10:49 -0800 Subject: [PATCH 1/5] wave 1-3 --- lib/problems.rb | 27 +++++++++++++++++++--- lib/queue.rb | 53 ++++++++++++++++++++++++++++++------------- lib/stack.rb | 11 +++++---- test/problems_test.rb | 5 ---- test/queue_test.rb | 39 +++++++++++++++---------------- test/stack_test.rb | 21 +++++++---------- 6 files changed, 95 insertions(+), 61 deletions(-) diff --git a/lib/problems.rb b/lib/problems.rb index 5085953d..693283ad 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -1,11 +1,32 @@ require_relative './stack.rb' -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) +# Space Complexity: O(n) def balanced(string) - raise NotImplementedError, "Not implemented yet" + braces_stack = Stack.new + string.each_char do |n| + case n + when "(" + braces_stack.push(n) + when "{" + braces_stack.push(n) + when "[" + braces_stack.push(n) + when ")" + return false if !stack_checker(braces_stack, "(") + when "}" + return false if !stack_checker(braces_stack, "{") + when "]" + return false if !stack_checker(braces_stack, "[") + end + end + return braces_stack.empty? end +def stack_checker(stack, expected_paren) + return !(stack.empty? || stack.pop != expected_paren) +end + # Time Complexity: ? # Space Complexity: ? def evaluate_postfix(postfix_expression) diff --git a/lib/queue.rb b/lib/queue.rb index 828217c6..afb8752a 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,31 +1,52 @@ class Queue - + + #when front and back are the same, how do you know when the queue is full or empty? depends on the operation you just did. consider changing both to -1 if the array is empty after dequeueing. + def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @store = Array.new(10) + @front = 0 + @back = 0 end - + def enqueue(element) - raise NotImplementedError, "Not yet implemented" + #resize if the array is full + if @front == @back + 1 % @store.length + temp = Array.new(@store.length + 1) + @store.each { |n| temp << n } + @store = temp + puts "new array is #{@store.to_s}" + end + #add the element + @store[@back] = element + @back = (@back + 1) % @store.length end - + def dequeue - raise NotImplementedError, "Not yet implemented" - end - + if @front != @back + temp = @store[@front] + @store[@front] = nil + @front = (@front + 1) % @store.length + return temp + end + end + def front - raise NotImplementedError, "Not yet implemented" + return @store[@front] end - + def size - raise NotImplementedError, "Not yet implemented" + return abs(@back - @front + 1) end - + def empty? - raise NotImplementedError, "Not yet implemented" + return @front == @back end - + def to_s - return @store.to_s + temp = [] + @store.each do |n| + temp << n if n + end + return "#{temp}" end end diff --git a/lib/stack.rb b/lib/stack.rb index cfc6ef0f..ef61f09d 100644 --- a/lib/stack.rb +++ b/lib/stack.rb @@ -1,19 +1,20 @@ +require_relative '../lib/linked_list' + class Stack def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @store = LinkedList.new end def push(element) - raise NotImplementedError, "Not yet implemented" + @store.add_last(element) end def pop - raise NotImplementedError, "Not yet implemented" + @store.remove_last() end def empty? - raise NotImplementedError, "Not yet implemented" + return @store.empty? end def to_s diff --git a/test/problems_test.rb b/test/problems_test.rb index f851f1d2..546fff53 100644 --- a/test/problems_test.rb +++ b/test/problems_test.rb @@ -7,30 +7,25 @@ describe "Test wave 3 problems" do describe "balanced" do it "Given balanced strings it should return true" do - skip expect(balanced('(({}))')).must_equal true end it "regards an empty string as balanced" do - skip expect(balanced('')).must_equal true end it "will return false for an unbalanced set of parens" do - skip expect(balanced('(()')).must_equal false expect(balanced('(()}')).must_equal false expect(balanced('([]]')).must_equal false end it "also works for {} and []" do - skip expect(balanced('[]')).must_equal true expect(balanced('{}')).must_equal true end it "also works if the string has opens and closes in the beginning and end" do - skip expect(balanced('[]()')).must_equal true end end diff --git a/test/queue_test.rb b/test/queue_test.rb index 8a7dcd9c..81d81aa3 100644 --- a/test/queue_test.rb +++ b/test/queue_test.rb @@ -7,65 +7,67 @@ describe "Test Queue Implementation" do it "creates a Queue" do q = Queue.new - q.class.must_equal Queue + expect(q.class).must_equal Queue end it "adds something to an empty Queue" do - skip q = Queue.new q.enqueue(10) - q.to_s.must_equal "[10]" + expect(q.to_s).must_equal "[10]" end it "adds multiple somethings to a Queue" do - skip q = Queue.new q.enqueue(10) q.enqueue(20) q.enqueue(30) - q.to_s.must_equal "[10, 20, 30]" + expect(q.to_s).must_equal "[10, 20, 30]" end it "starts the size of a Queue at 0" do - skip q = Queue.new - q.empty?.must_equal true + _(q.empty?).must_equal true + end + + it "a Queue is empty after removing all the elements" do + q = Queue.new + q.enqueue(5) + q.enqueue(6) + expect(q.dequeue).must_equal 5 + expect(q.dequeue).must_equal 6 + expect(q.empty?).must_equal true end it "removes something from the Queue" do - skip q = Queue.new q.enqueue(5) removed = q.dequeue removed.must_equal 5 - q.empty?.must_equal true + _(q.empty?).must_equal true end it "removes the right something (LIFO)" do - skip q = Queue.new q.enqueue(5) q.enqueue(3) q.enqueue(7) removed = q.dequeue - removed.must_equal 5 - q.to_s.must_equal "[3, 7]" + _(removed).must_equal 5 + _(q.to_s).must_equal "[3, 7]" end it "properly adjusts the size with enqueueing and dequeueing" do - skip q = Queue.new q.empty?.must_equal true q.enqueue(-1) q.enqueue(-60) - q.empty?.must_equal false + _(q.empty?).must_equal false q.dequeue q.dequeue - q.empty?.must_equal true + _(q.empty?).must_equal true end it "returns the front element in the Queue" do - skip q = Queue.new q.enqueue(40) q.enqueue(22) @@ -92,7 +94,6 @@ q.enqueue(130) q.enqueue(140) q.enqueue(150) - q.enqueue(150) q.enqueue(160) q.enqueue(170) q.enqueue(180) @@ -101,6 +102,6 @@ q.enqueue(210) q.dequeue - expect(q.to_s).must_equal('[40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240]') + expect(q.to_s).must_equal('[30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200]') end -end +end \ No newline at end of file diff --git a/test/stack_test.rb b/test/stack_test.rb index df5046c8..ae31478f 100644 --- a/test/stack_test.rb +++ b/test/stack_test.rb @@ -6,48 +6,43 @@ describe "Test Stack Implementation" do it "creates a Stack" do s = Stack.new - s.class.must_equal Stack + _(s.class).must_equal Stack end it "pushes something onto a empty Stack" do - skip s = Stack.new s.push(10) - s.to_s.must_equal "[10]" + _(s.to_s).must_equal "[10]" end it "pushes multiple somethings onto a Stack" do - skip s = Stack.new s.push(10) s.push(20) s.push(30) - s.to_s.must_equal "[10, 20, 30]" + _(s.to_s).must_equal "[10, 20, 30]" end it "starts the stack empty" do - skip s = Stack.new - s.empty?.must_equal true + _(s.empty?).must_equal true end it "removes something from the stack" do - skip s = Stack.new s.push(5) removed = s.pop - removed.must_equal 5 - s.empty?.must_equal true + _(removed).must_equal 5 + _(s.empty?).must_equal true end it "removes the right something (LIFO)" do - skip s = Stack.new s.push(5) s.push(3) s.push(7) removed = s.pop - removed.must_equal 7 - s.to_s.must_equal "[5, 3]" + _(removed).must_equal 7 + _(s.to_s).must_equal "[5, 3]" end end \ No newline at end of file From 64858425da0752f2b3e8eca359c1e0dc6ab4d554 Mon Sep 17 00:00:00 2001 From: Emily Vomacka Date: Mon, 2 Mar 2020 22:59:41 -0800 Subject: [PATCH 2/5] queue update --- lib/queue.rb | 26 +++++++++++++++++++------- test/queue_test.rb | 20 ++++++++++---------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/lib/queue.rb b/lib/queue.rb index afb8752a..ab22fc48 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,7 +1,5 @@ class Queue - #when front and back are the same, how do you know when the queue is full or empty? depends on the operation you just did. consider changing both to -1 if the array is empty after dequeueing. - def initialize @store = Array.new(10) @front = 0 @@ -10,11 +8,23 @@ def initialize def enqueue(element) #resize if the array is full - if @front == @back + 1 % @store.length + if @front == (@back + 1) % @store.length temp = Array.new(@store.length + 1) - @store.each { |n| temp << n } + if @front > @back + temp.each_index do |n| + if n < @front + temp[n] = @store[n] + elsif n > @front + temp[n] = @store[n-1] + end + end + @front += 1 + else + temp.each_index do |n| + temp[n] = @store[n] + end + end @store = temp - puts "new array is #{@store.to_s}" end #add the element @store[@back] = element @@ -44,8 +54,10 @@ def empty? def to_s temp = [] - @store.each do |n| - temp << n if n + curr = @front + until curr == @back + temp << @store[curr] if @store[curr] + curr = (curr + 1) % @store.length end return "#{temp}" end diff --git a/test/queue_test.rb b/test/queue_test.rb index 81d81aa3..9c960225 100644 --- a/test/queue_test.rb +++ b/test/queue_test.rb @@ -9,13 +9,13 @@ q = Queue.new expect(q.class).must_equal Queue end - + it "adds something to an empty Queue" do q = Queue.new q.enqueue(10) expect(q.to_s).must_equal "[10]" end - + it "adds multiple somethings to a Queue" do q = Queue.new q.enqueue(10) @@ -23,12 +23,12 @@ q.enqueue(30) expect(q.to_s).must_equal "[10, 20, 30]" end - + it "starts the size of a Queue at 0" do q = Queue.new _(q.empty?).must_equal true end - + it "a Queue is empty after removing all the elements" do q = Queue.new q.enqueue(5) @@ -37,7 +37,7 @@ expect(q.dequeue).must_equal 6 expect(q.empty?).must_equal true end - + it "removes something from the Queue" do q = Queue.new q.enqueue(5) @@ -45,7 +45,7 @@ removed.must_equal 5 _(q.empty?).must_equal true end - + it "removes the right something (LIFO)" do q = Queue.new q.enqueue(5) @@ -55,7 +55,7 @@ _(removed).must_equal 5 _(q.to_s).must_equal "[3, 7]" end - + it "properly adjusts the size with enqueueing and dequeueing" do q = Queue.new q.empty?.must_equal true @@ -66,7 +66,7 @@ q.dequeue _(q.empty?).must_equal true end - + it "returns the front element in the Queue" do q = Queue.new q.enqueue(40) @@ -101,7 +101,7 @@ q.enqueue(200) q.enqueue(210) q.dequeue - - expect(q.to_s).must_equal('[30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200]') + + expect(q.to_s).must_equal('[40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210]') end end \ No newline at end of file From a2c720d930c8ae619a648e8142057ede34a8495f Mon Sep 17 00:00:00 2001 From: Emily Vomacka Date: Mon, 2 Mar 2020 23:02:20 -0800 Subject: [PATCH 3/5] test fix --- test/queue_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/queue_test.rb b/test/queue_test.rb index 9c960225..997c5583 100644 --- a/test/queue_test.rb +++ b/test/queue_test.rb @@ -58,7 +58,7 @@ it "properly adjusts the size with enqueueing and dequeueing" do q = Queue.new - q.empty?.must_equal true + _(q.empty?).must_equal true q.enqueue(-1) q.enqueue(-60) _(q.empty?).must_equal false From d3ee19d29199482e169f9e2be968d71ff34c684a Mon Sep 17 00:00:00 2001 From: Emily Vomacka Date: Mon, 2 Mar 2020 23:31:02 -0800 Subject: [PATCH 4/5] postfix --- lib/problems.rb | 23 ++++++++++++++++++++++- test/problems_test.rb | 2 -- test/queue_test.rb | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/problems.rb b/lib/problems.rb index 693283ad..4bcab60b 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -30,5 +30,26 @@ def stack_checker(stack, expected_paren) # Time Complexity: ? # Space Complexity: ? def evaluate_postfix(postfix_expression) - raise NotImplementedError, "Not implemented yet" + stack = Stack.new + postfix_expression.each_char do |n| + if /\+|-|\*|\//.match(n) + stack_operation_helper(stack, stack.pop, stack.pop, n) + else + stack.push(n) + end + end + return stack.pop end + +def stack_operation_helper(stack, first_pop, second_pop, operator) + case operator + when "+" + stack.push(second_pop.to_i + first_pop.to_i) + when "-" + stack.push(second_pop.to_i - first_pop.to_i) + when "*" + stack.push(second_pop.to_i * first_pop.to_i) + when "/" + stack.push(second_pop.to_i / first_pop.to_i) + end +end diff --git a/test/problems_test.rb b/test/problems_test.rb index 546fff53..0cae4fb5 100644 --- a/test/problems_test.rb +++ b/test/problems_test.rb @@ -32,7 +32,6 @@ describe "postfix" do it "can add a 2 numbers together" do - skip expect(evaluate_postfix("34+")).must_equal 7 expect(evaluate_postfix("34*")).must_equal 12 expect(evaluate_postfix("34-")).must_equal -1 @@ -40,7 +39,6 @@ end it "can add a evaluate a more complicated expression" do - skip expect(evaluate_postfix("34+2*")).must_equal 14 expect(evaluate_postfix("34*2/")).must_equal 6 expect(evaluate_postfix("34-1+")).must_equal 0 diff --git a/test/queue_test.rb b/test/queue_test.rb index 997c5583..197b3578 100644 --- a/test/queue_test.rb +++ b/test/queue_test.rb @@ -42,7 +42,7 @@ q = Queue.new q.enqueue(5) removed = q.dequeue - removed.must_equal 5 + _(removed).must_equal 5 _(q.empty?).must_equal true end From 5196b21bba26f3ab27ae504735a01483e5e2e48b Mon Sep 17 00:00:00 2001 From: Emily Vomacka Date: Mon, 2 Mar 2020 23:37:03 -0800 Subject: [PATCH 5/5] tc/sc --- lib/problems.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/problems.rb b/lib/problems.rb index 4bcab60b..a7eb51aa 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -27,8 +27,8 @@ def stack_checker(stack, expected_paren) return !(stack.empty? || stack.pop != expected_paren) end -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) +# Space Complexity: O(n) <- but we'd probably use less assuming the expression contains operators def evaluate_postfix(postfix_expression) stack = Stack.new postfix_expression.each_char do |n|