diff --git a/lib/problems.rb b/lib/problems.rb index 5085953d..3cc887c9 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -1,13 +1,40 @@ require_relative './stack.rb' -# Time Complexity: ? -# Space Complexity: ? + +# Time Complexity: O(n) +# Space Complexity: O(n) def balanced(string) - raise NotImplementedError, "Not implemented yet" + # raise NotImplementedError, "Not implemented yet" + return true if string.empty? + + stack = Stack.new() + + open = { + '(' => ')', + '{' => '}', + '[' => ']' + } + + close = { + ')' => '(', + '}' => '{', + ']' => '[' + } + + string.each_char do |char| + if open[char] + stack.push(char) + elsif close[char] != stack.pop + return false + end + end + + return stack.empty? + end # Time Complexity: ? # Space Complexity: ? def evaluate_postfix(postfix_expression) - raise NotImplementedError, "Not implemented yet" + # raise NotImplementedError, "Not implemented yet" end diff --git a/lib/queue.rb b/lib/queue.rb index 828217c6..34e5c110 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,31 +1,73 @@ class Queue + MAX_SIZE = 20 + def initialize # @store = ... - raise NotImplementedError, "Not yet implemented" + # raise NotImplementedError, "Not yet implemented" + @store = Array.new(MAX_SIZE) + @front = -1 + @rear = -1 end def enqueue(element) - raise NotImplementedError, "Not yet implemented" + # raise NotImplementedError, "Not yet implemented" + if (@front == 0 && @rear == MAX_SIZE - 1) || (@rear == (@front - 1) % (MAX_SIZE - 1)) + raise ArgumentError.new("The queue is full.") + elsif @front == -1 + @front = 0 + @rear = 0 + elsif @rear == MAX_SIZE - 1 && @front != 0 + @rear = 0 + else + @rear += 1 + end + @store[@rear] = element end def dequeue - raise NotImplementedError, "Not yet implemented" + # raise NotImplementedError, "Not yet implemented" + return nil if @store.empty? + raise ArgumentError.new("Queue is empty") if @front == -1 + data =@store[@front] + @store[@front] = nil + + if @front == @rear + @front = -1 + @rear = -1 + elsif @front == MAX_SIZE - 1 + @front = 0 + else + @front += 1 + end + return data + end def front - raise NotImplementedError, "Not yet implemented" + # raise NotImplementedError, "Not yet implemented" + return @store[@front] end def size - raise NotImplementedError, "Not yet implemented" + # raise NotImplementedError, "Not yet implemented" + return 0 if @front == -1 + return @front < @rear ? @rear - @front + 1 : MAX_SIZE - @front + @rear end def empty? - raise NotImplementedError, "Not yet implemented" + # raise NotImplementedError, "Not yet implemented" + return @front == -1 end def to_s - return @store.to_s + # return @store.to_s + result = [] + MAX_SIZE.times do |i| + index = ( i + @front) % MAX_SIZE + result << @store[index] if @store[index] + end + return result.to_s end + end diff --git a/lib/stack.rb b/lib/stack.rb index cfc6ef0f..6b34fd7d 100644 --- a/lib/stack.rb +++ b/lib/stack.rb @@ -1,19 +1,25 @@ class Stack def initialize # @store = ... - raise NotImplementedError, "Not yet implemented" + # raise NotImplementedError, "Not yet implemented" + @store = LinkedList.new end def push(element) - raise NotImplementedError, "Not yet implemented" + # raise NotImplementedError, "Not yet implemented" + @store.add_first(element) end def pop - raise NotImplementedError, "Not yet implemented" + # raise NotImplementedError, "Not yet implemented" + return nil if self.empty? + item = @store.remove_first + return item end def empty? - raise NotImplementedError, "Not yet implemented" + # 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 046f059e..1738b39f 100644 --- a/test/problems_test.rb +++ b/test/problems_test.rb @@ -1,8 +1,9 @@ require_relative 'test_helper' +require_relative '../lib/problems' 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 +34,7 @@ end end - describe "postfix" do + xdescribe "postfix" do it "can add a 2 numbers together" do expect(evaluate_postfix("34+")).must_equal 7