diff --git a/lib/problems.rb b/lib/problems.rb index 5085953d..fea1a11e 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -1,13 +1,52 @@ require_relative './stack.rb' -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) - goes through all input elements +# Space Complexity: O(n) - stack will take at least half of symbols in string def balanced(string) - raise NotImplementedError, "Not implemented yet" + return true if string.length == 0 + + pairs = {"(" => ")", "{" => "}", "[" => "]"} + expectations = Stack.new + string.chars.each do |char| + if pairs[char] + expected_element = pairs[char] + expectations.push(expected_element) + else + if expectations.pop != char + return false + end + end + end + return expectations.empty? end -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) - goes through all input elements +# Space Complexity: O(1) - stack will never have more than 2 elements def evaluate_postfix(postfix_expression) - raise NotImplementedError, "Not implemented yet" -end + operands = Stack.new + postfix_expression.chars.each do |element| + if element.to_i.to_s == element + operands.push(element.to_i) + else + num2 = operands.pop + num1 = operands.pop + case element + when "+" + answer = num1 + num2 + when "*" + answer = num1 * num2 + when "-" + answer = num1 - num2 + when "/" + answer = num1 / num2 + end + operands.push(answer) + end + end + result = operands.pop + if operands.empty? + return result + else + raise Exception.new "Expression is not valid" + end +end \ No newline at end of file diff --git a/lib/queue.rb b/lib/queue.rb index 828217c6..5633cc38 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,31 +1,54 @@ class Queue def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @store = Array.new + @size = 20 + @start = 0 + @end = 0 end def enqueue(element) - raise NotImplementedError, "Not yet implemented" + # check if we can add more elements + raise Exception.new "No vacant spots in queue" if @size < self.size + + @store[@end] = element + @end = (@end + 1) % @size end def dequeue - raise NotImplementedError, "Not yet implemented" + raise Exception.new "No elements in queue" if self.size == 0 + element = @store[@start] + @store[@start] = nil + @start = (@start + 1) % @size + return element end def front - raise NotImplementedError, "Not yet implemented" + raise Exception.new "No elements in queue" if self.size == 0 + @store[@start] end def size - raise NotImplementedError, "Not yet implemented" + if @end == @start && @store[@start] + return 20 + elsif @end > @start + return @end - @start + elsif @end < @start + return @end + @size - @start + else + return 0 + end end def empty? - raise NotImplementedError, "Not yet implemented" + @end == @start end def to_s - return @store.to_s + if @end > @start + return @store[@start..@end].to_s + else + return (@store[@start..@size-1] + @store[0..@end-1]).to_s + end end end diff --git a/lib/stack.rb b/lib/stack.rb index cfc6ef0f..966e0492 100644 --- a/lib/stack.rb +++ b/lib/stack.rb @@ -1,19 +1,20 @@ +require_relative './linked_list.rb' + 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 to_s diff --git a/test/problems_test.rb b/test/problems_test.rb index 046f059e..c0cfc618 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 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