diff --git a/README.md b/README.md index d6397703..b245ca2d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ In this exercise we will implement both a stack & a queue, and then use them in a variety of hands-on exercises. -**Due: Monday Sept 7th** +**Due: Tuesday Sept 8th** ## Learning Goals diff --git a/lib/linked_list.rb b/lib/linked_list.rb index 136d8ac9..edd32b4d 100644 --- a/lib/linked_list.rb +++ b/lib/linked_list.rb @@ -37,7 +37,7 @@ def remove_first() value = @head.data @head = @head.next - @head.previous = nil + @head.previous = nil unless @head.nil? return value end @@ -339,4 +339,4 @@ def to_s return list.to_s end -end \ No newline at end of file +end diff --git a/lib/queue.rb b/lib/queue.rb index 828217c6..d6e12ed6 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,31 +1,63 @@ class Queue def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @size = 20 + @store = Array.new + @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 ArgumentError.new('Queue is full') + elsif @front == -1 && @rear == -1 + @front = @rear = 0 + elsif @rear == @size - 1 && @front != 0 + @rear = 0 + else + @rear = @rear + 1 + end + + @store[@rear] = element end def dequeue - raise NotImplementedError, "Not yet implemented" + if @front == -1 + raise ArgumentError.new('Queue is empty') + end + + data = @store[@front] + @store[@front] = nil + + if @front == @rear + @front = @rear = -1 + elsif @front == @size - 1 + @front = 0 + else + @front = @front + 1 + end + + return data end def front - raise NotImplementedError, "Not yet implemented" + return @store[@front] end def size - raise NotImplementedError, "Not yet implemented" + return @back >= @front ? (@back - @front) : (@size - @front + @back) end def empty? - raise NotImplementedError, "Not yet implemented" + return @front == -1 end def to_s - return @store.to_s + queue = [] + @size.times do |i| + index = (i + @front) % @size + queue << @store[index] if @store[index] + end + return queue.to_s end end diff --git a/lib/stack.rb b/lib/stack.rb index cfc6ef0f..10c94de6 100644 --- a/lib/stack.rb +++ b/lib/stack.rb @@ -1,19 +1,20 @@ 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" + return nil if self.empty? + + return @store.remove_first() end def empty? - raise NotImplementedError, "Not yet implemented" + return @store.empty? end def to_s diff --git a/test/stack_test.rb b/test/stack_test.rb index 1df0b077..1c4572d8 100644 --- a/test/stack_test.rb +++ b/test/stack_test.rb @@ -3,13 +3,13 @@ describe "Test Stack Implementation" do it "creates a Stack" do s = Stack.new - s.class.must_equal Stack + expect(s.class).must_equal Stack end it "pushes something onto a empty Stack" do s = Stack.new s.push(10) - s.to_s.must_equal "[10]" + expect(s.pop).must_equal 10 end it "pushes multiple somethings onto a Stack" do @@ -17,7 +17,9 @@ s.push(10) s.push(20) s.push(30) - s.to_s.must_equal "[10, 20, 30]" + expect(s.pop).must_equal 30 + expect(s.pop).must_equal 20 + expect(s.pop).must_equal 10 end it "starts the stack empty" do @@ -29,8 +31,8 @@ s = Stack.new s.push(5) removed = s.pop - removed.must_equal 5 - s.empty?.must_equal true + expect(removed).must_equal 5 + expect(s.empty?).must_equal true end it "removes the right something (LIFO)" do @@ -39,7 +41,6 @@ s.push(3) s.push(7) removed = s.pop - removed.must_equal 7 - s.to_s.must_equal "[5, 3]" + expect(removed).must_equal 7 end -end \ No newline at end of file +end