diff --git a/lib/problems.rb b/lib/problems.rb index 61bcaa5a..26d6fbfa 100644 --- a/lib/problems.rb +++ b/lib/problems.rb @@ -1,9 +1,54 @@ -require_relative './stack.rb' +require_relative "./stack.rb" def balanced(string) - raise NotImplementedError, "Not implemented yet" + return true if string == "" + + parens_hash = { + "(" => ")", + "[" => "]", + "{" => "}", + } + + stack_parens = Stack.new + string.each_char do |paren| + if parens_hash[paren] + stack_parens.push(parens_hash[paren]) + else + return false if paren != stack_parens.pop + end + end + + return stack_parens.empty? end def evaluate_postfix(postfix_expression) - raise NotImplementedError, "Not implemented yet" -end \ No newline at end of file + operand_hash = { + "+" => true, + "-" => true, + "*" => true, + "/" => true, + } + + stack_postfix = Stack.new + postfix_expression.each_char do |char| + if !operand_hash[char] + stack_postfix.push(char) + else + digit2 = stack_postfix.pop.to_i + digit1 = stack_postfix.pop.to_i + + case char + when "+" + value = digit1 + digit2 + when "-" + value = digit1 - digit2 + when "*" + value = digit1 * digit2 + when "/" + value = digit1 / digit2 + end + stack_postfix.push(value) + end + end + return stack_postfix.pop +end diff --git a/lib/queue.rb b/lib/queue.rb index 828217c6..94490ee5 100644 --- a/lib/queue.rb +++ b/lib/queue.rb @@ -1,31 +1,63 @@ class Queue + QUEUE_SIZE = 20 def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @store = Array.new(QUEUE_SIZE) + @front = @rear = -1 #-1 because it is not index in array, bc front and rear float around we dont know there will be any particular value + #use -1 to indicate the queue is empty end def enqueue(element) - raise NotImplementedError, "Not yet implemented" + if @front == -1 # queue is empty + @front = 0 + @rear = 0 + @store[@rear] = element + elsif @front == (@rear + 1) % @store.length # queue is full + raise Error, "Q full" + else # queue not empty + @rear += 1 + @store[@rear] = element + end end def dequeue - raise NotImplementedError, "Not yet implemented" + if @front == -1 + raise Error, "Q is empty" + elsif @front == @rear + removed_value = @store[@front] + @store[@front] = nil + @front = @rear = -1 + return removed_value + else + new_front = (@front + 1) % @store.length + removed_value1 = @store[@front] + @store[@front] = nil + @front = new_front + return removed_value1 + end end def front - raise NotImplementedError, "Not yet implemented" + if @front == -1 + raise Error, "Q is empty" + else + return @store[@front] + end end def size - raise NotImplementedError, "Not yet implemented" + return @store[@front..@rear].length end def empty? - raise NotImplementedError, "Not yet implemented" + if @front == -1 + return true + else + return false + end end def to_s - return @store.to_s + return @store[@front..@rear].to_s end end diff --git a/lib/stack.rb b/lib/stack.rb index cfc6ef0f..8757bdeb 100644 --- a/lib/stack.rb +++ b/lib/stack.rb @@ -1,19 +1,22 @@ +require_relative "linked_list.rb" + class Stack def initialize - # @store = ... - raise NotImplementedError, "Not yet implemented" + @store = LinkedList.new + # @top = nil end def push(element) - raise NotImplementedError, "Not yet implemented" + #If using a linked list for a stack, is there a disadvantage to using a singly linked list and use the add_first method for push and remove_first method for pop? + @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 9d30e1cd..cea5bad7 100644 --- a/test/problems_test.rb +++ b/test/problems_test.rb @@ -1,38 +1,33 @@ -require 'minitest/autorun' -require 'minitest/reporters' -require_relative '../lib/problems' +require "minitest/autorun" +require "minitest/reporters" +require_relative "../lib/problems" Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new describe "Test wave 3 problems" do describe "balanced" do it "Given balanced strings it should return true" do - skip - expect(balanced('(({}))')).must_equal true + expect(balanced("(({}))")).must_equal true end it "regards an empty string as balanced" do - skip - expect(balanced('')).must_equal true + 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 + 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 + expect(balanced("[]")).must_equal true + expect(balanced("{}")).must_equal true end end 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 +35,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 @@ -49,4 +43,4 @@ expect(evaluate_postfix("62/5+")).must_equal 8 end end -end \ No newline at end of file +end diff --git a/test/queue_test.rb b/test/queue_test.rb index 9b616a30..453d959d 100644 --- a/test/queue_test.rb +++ b/test/queue_test.rb @@ -1,6 +1,6 @@ -require 'minitest/autorun' -require 'minitest/reporters' -require_relative '../lib/queue' +require "minitest/autorun" +require "minitest/reporters" +require_relative "../lib/queue" Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new @@ -11,14 +11,12 @@ end it "adds something to an empty Queue" do - skip q = Queue.new q.enqueue(10) 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) @@ -27,13 +25,11 @@ end it "starts the size of a Queue at 0" do - skip q = Queue.new q.empty?.must_equal true end it "removes something from the Queue" do - skip q = Queue.new q.enqueue(5) removed = q.dequeue @@ -42,7 +38,6 @@ end it "removes the right something (LIFO)" do - skip q = Queue.new q.enqueue(5) q.enqueue(3) @@ -53,7 +48,6 @@ end it "properly adjusts the size with enqueueing and dequeueing" do - skip q = Queue.new q.empty?.must_equal true q.enqueue(-1) @@ -65,7 +59,6 @@ end it "returns the front element in the Queue" do - skip q = Queue.new q.enqueue(40) q.enqueue(22) @@ -73,4 +66,4 @@ q.dequeue expect(q.dequeue).must_equal 22 end -end \ No newline at end of file +end diff --git a/test/stack_test.rb b/test/stack_test.rb index df5046c8..3511e6a8 100644 --- a/test/stack_test.rb +++ b/test/stack_test.rb @@ -1,6 +1,6 @@ -require 'minitest/autorun' -require 'minitest/reporters' -require_relative '../lib/stack' +require "minitest/autorun" +require "minitest/reporters" +require_relative "../lib/stack" Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new describe "Test Stack Implementation" do @@ -10,14 +10,12 @@ end it "pushes something onto a empty Stack" do - skip s = Stack.new s.push(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) @@ -26,13 +24,11 @@ end it "starts the stack empty" do - skip s = Stack.new s.empty?.must_equal true end it "removes something from the stack" do - skip s = Stack.new s.push(5) removed = s.pop @@ -41,7 +37,6 @@ end it "removes the right something (LIFO)" do - skip s = Stack.new s.push(5) s.push(3) @@ -50,4 +45,4 @@ removed.must_equal 7 s.to_s.must_equal "[5, 3]" end -end \ No newline at end of file +end