From 47f1bdd9e403d63262af892906313057ca48546c Mon Sep 17 00:00:00 2001 From: rikim Date: Sun, 3 May 2020 16:23:48 +0900 Subject: [PATCH 1/7] Add MinStackImplementation and test class --- .../company/stack/MinStackImplementation.java | 37 +++++++++++++++++++ .../stack/MinStackImplementationTest.java | 25 +++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/main/java/com/company/stack/MinStackImplementation.java create mode 100644 src/test/java/com/company/stack/MinStackImplementationTest.java diff --git a/src/main/java/com/company/stack/MinStackImplementation.java b/src/main/java/com/company/stack/MinStackImplementation.java new file mode 100644 index 0000000..2de5b21 --- /dev/null +++ b/src/main/java/com/company/stack/MinStackImplementation.java @@ -0,0 +1,37 @@ +package com.company.stack; + +import java.util.Stack; + +interface MinStack { + public void push(int number); + + public int pop(); + + public int getMin(); +} + +/** + * All the operations of MinStack should be constant value time complexity. O(1) + */ +public class MinStackImplementation implements MinStack { + private final Stack valueStack = new Stack<>(); + private final Stack minStack = new Stack<>(); + + @Override + public void push(int number) { + valueStack.push(number); + if (minStack.empty() || minStack.peek() > number) { + minStack.push(number); + } + } + + @Override + public int pop() { + return 0; + } + + @Override + public int getMin() { + return minStack.peek(); + } +} \ No newline at end of file diff --git a/src/test/java/com/company/stack/MinStackImplementationTest.java b/src/test/java/com/company/stack/MinStackImplementationTest.java new file mode 100644 index 0000000..12f0a81 --- /dev/null +++ b/src/test/java/com/company/stack/MinStackImplementationTest.java @@ -0,0 +1,25 @@ +package com.company.stack; + +import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class MinStackImplementationTest { + + @Test + public void getMin_whenMinStackContainsOneNumber_thenReturningTheValue() { + // Given + MinStack minStackImplementation = new MinStackImplementation(); + int theOnlyOneNumber = 1; + minStackImplementation.push(theOnlyOneNumber); + + // When + int min = minStackImplementation.getMin(); + + // Then + Assertions.assertThat(min).isEqualTo(theOnlyOneNumber); + } + +} \ No newline at end of file From 0c28b728b00ca8f4295ee24dcd0720a2aeb83c96 Mon Sep 17 00:00:00 2001 From: rikim Date: Sun, 3 May 2020 16:31:29 +0900 Subject: [PATCH 2/7] Add test case of pushing non-min value --- .../stack/MinStackImplementationTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/java/com/company/stack/MinStackImplementationTest.java b/src/test/java/com/company/stack/MinStackImplementationTest.java index 12f0a81..e56bd6a 100644 --- a/src/test/java/com/company/stack/MinStackImplementationTest.java +++ b/src/test/java/com/company/stack/MinStackImplementationTest.java @@ -22,4 +22,21 @@ public void getMin_whenMinStackContainsOneNumber_thenReturningTheValue() { Assertions.assertThat(min).isEqualTo(theOnlyOneNumber); } + @Test + public void getMin_whenLastInValueIsNotTheMinValue_andWhenTheLastInValueIsPushed_thenTheMinValuesIsEqualToTheValueBeforePushing() { + // Given + MinStack minStackImplementation = new MinStackImplementation(); + int firstInValue = 1; + minStackImplementation.push(firstInValue); + int minValueBeforePush = minStackImplementation.getMin(); + + // When + int LastInValue = 10; + minStackImplementation.push(firstInValue); + int min = minStackImplementation.getMin(); + + // Then + Assertions.assertThat(min).isEqualTo(minValueBeforePush); + } + } \ No newline at end of file From c1faf07f2208a75fbbb06877c03a7ba2557400b8 Mon Sep 17 00:00:00 2001 From: rikim Date: Sun, 3 May 2020 16:35:51 +0900 Subject: [PATCH 3/7] Add test case of pushing the value to be the new minValue --- .../stack/MinStackImplementationTest.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/company/stack/MinStackImplementationTest.java b/src/test/java/com/company/stack/MinStackImplementationTest.java index e56bd6a..fa4f1b3 100644 --- a/src/test/java/com/company/stack/MinStackImplementationTest.java +++ b/src/test/java/com/company/stack/MinStackImplementationTest.java @@ -31,12 +31,28 @@ public void getMin_whenLastInValueIsNotTheMinValue_andWhenTheLastInValueIsPushed int minValueBeforePush = minStackImplementation.getMin(); // When - int LastInValue = 10; - minStackImplementation.push(firstInValue); + int lastInValueButNeverBeingMin = 10; + minStackImplementation.push(lastInValueButNeverBeingMin); int min = minStackImplementation.getMin(); // Then Assertions.assertThat(min).isEqualTo(minValueBeforePush); } + @Test + public void getMin_whenLastInValueIsTheMinValue_andWhenTheLastInValueIsPushed_thenTheMinValuesShouldBeLastInValue() { + // Given + MinStack minStackImplementation = new MinStackImplementation(); + int firstInValue = 10; + minStackImplementation.push(firstInValue); + + // When + int lastInValueBeingMinValue = 1; + minStackImplementation.push(lastInValueBeingMinValue); + int min = minStackImplementation.getMin(); + + // Then + Assertions.assertThat(min).isEqualTo(lastInValueBeingMinValue); + } + } \ No newline at end of file From 50add838b4c3d06e5dc8729ca8d658140da7c803 Mon Sep 17 00:00:00 2001 From: rikim Date: Sun, 3 May 2020 17:28:58 +0900 Subject: [PATCH 4/7] Add case of popping when the top is min value --- .../company/stack/MinStackImplementation.java | 3 ++- .../stack/MinStackImplementationTest.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/company/stack/MinStackImplementation.java b/src/main/java/com/company/stack/MinStackImplementation.java index 2de5b21..6a1aa27 100644 --- a/src/main/java/com/company/stack/MinStackImplementation.java +++ b/src/main/java/com/company/stack/MinStackImplementation.java @@ -27,7 +27,8 @@ public void push(int number) { @Override public int pop() { - return 0; + minStack.pop(); + return valueStack.pop(); } @Override diff --git a/src/test/java/com/company/stack/MinStackImplementationTest.java b/src/test/java/com/company/stack/MinStackImplementationTest.java index fa4f1b3..3846761 100644 --- a/src/test/java/com/company/stack/MinStackImplementationTest.java +++ b/src/test/java/com/company/stack/MinStackImplementationTest.java @@ -55,4 +55,22 @@ public void getMin_whenLastInValueIsTheMinValue_andWhenTheLastInValueIsPushed_th Assertions.assertThat(min).isEqualTo(lastInValueBeingMinValue); } + @Test + public void getMin_whenTheTopValueIsMinValue_andWhenTheStackPopsTheValue_thenTheMinValuesShouldBeThePreviousMinValue() { + // Given + MinStack minStackImplementation = new MinStackImplementation(); + int firstInValue = 10; + minStackImplementation.push(firstInValue); + int prevMinValue = minStackImplementation.getMin(); + + int lastInValueBeingMinValue = 1; + minStackImplementation.push(lastInValueBeingMinValue); + + // When + minStackImplementation.pop(); + int minValueAfterPopping = minStackImplementation.getMin(); + + // Then + Assertions.assertThat(minValueAfterPopping).isEqualTo(prevMinValue); + } } \ No newline at end of file From 0c6641534b88c9d001df6779100c53a91966151b Mon Sep 17 00:00:00 2001 From: rikim Date: Sun, 3 May 2020 17:57:02 +0900 Subject: [PATCH 5/7] Add case of popping when the top is min value and when the top is NOT min value --- .../stack/MinStackImplementationTest.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/test/java/com/company/stack/MinStackImplementationTest.java b/src/test/java/com/company/stack/MinStackImplementationTest.java index 3846761..0db0ba8 100644 --- a/src/test/java/com/company/stack/MinStackImplementationTest.java +++ b/src/test/java/com/company/stack/MinStackImplementationTest.java @@ -73,4 +73,42 @@ public void getMin_whenTheTopValueIsMinValue_andWhenTheStackPopsTheValue_thenThe // Then Assertions.assertThat(minValueAfterPopping).isEqualTo(prevMinValue); } + + @Test + public void getMin_whenTheTopValueIsNotMinValue_andWhenTheStackPopsTheValue_thenTheMinValuesShouldNotChange() { + // Given + MinStack minStackImplementation = new MinStackImplementation(); + int firstInValue = 1; + minStackImplementation.push(firstInValue); + + int lastInValueBeingMinValue = 10; + minStackImplementation.push(lastInValueBeingMinValue); + int minValueBeforePopping = minStackImplementation.getMin(); + + // When + minStackImplementation.pop(); + int minValueAfterPopping = minStackImplementation.getMin(); + + // Then + Assertions.assertThat(minValueAfterPopping).isEqualTo(minValueBeforePopping); + } + + @Test + public void getMin_whenTheTopValueIsMinValue_andWhenTheStackPopsTheValue_thenTheMinValueShouldChangeToPreviousMinValue() { + // Given + MinStack minStackImplementation = new MinStackImplementation(); + int firstInValue = 10; + minStackImplementation.push(firstInValue); + int previousMinValue = minStackImplementation.getMin(); + + int lastInValueBeingMinValue = 1; + minStackImplementation.push(lastInValueBeingMinValue); + + // When + minStackImplementation.pop(); + int minValueAfterPopping = minStackImplementation.getMin(); + + // Then + Assertions.assertThat(minValueAfterPopping).isEqualTo(previousMinValue); + } } \ No newline at end of file From 411a34b21bf6e10c61174a8531be0e55fac6452c Mon Sep 17 00:00:00 2001 From: rikim Date: Sun, 3 May 2020 18:14:34 +0900 Subject: [PATCH 6/7] Fix pop() not to pop out of minStack when the top value is not the min value --- .../java/com/company/stack/MinStackImplementation.java | 4 +++- .../java/com/company/stack/MinStackImplementationTest.java | 7 +++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/company/stack/MinStackImplementation.java b/src/main/java/com/company/stack/MinStackImplementation.java index 6a1aa27..3e986fc 100644 --- a/src/main/java/com/company/stack/MinStackImplementation.java +++ b/src/main/java/com/company/stack/MinStackImplementation.java @@ -27,7 +27,9 @@ public void push(int number) { @Override public int pop() { - minStack.pop(); + if (minStack.peek().equals(valueStack.peek())) { + minStack.pop(); + } return valueStack.pop(); } diff --git a/src/test/java/com/company/stack/MinStackImplementationTest.java b/src/test/java/com/company/stack/MinStackImplementationTest.java index 0db0ba8..18568a5 100644 --- a/src/test/java/com/company/stack/MinStackImplementationTest.java +++ b/src/test/java/com/company/stack/MinStackImplementationTest.java @@ -36,7 +36,7 @@ public void getMin_whenLastInValueIsNotTheMinValue_andWhenTheLastInValueIsPushed int min = minStackImplementation.getMin(); // Then - Assertions.assertThat(min).isEqualTo(minValueBeforePush); + Assertions.assertThat(min).isEqualTo(firstInValue); } @Test @@ -83,9 +83,9 @@ public void getMin_whenTheTopValueIsNotMinValue_andWhenTheStackPopsTheValue_then int lastInValueBeingMinValue = 10; minStackImplementation.push(lastInValueBeingMinValue); - int minValueBeforePopping = minStackImplementation.getMin(); // When + int minValueBeforePopping = minStackImplementation.getMin(); minStackImplementation.pop(); int minValueAfterPopping = minStackImplementation.getMin(); @@ -99,7 +99,6 @@ public void getMin_whenTheTopValueIsMinValue_andWhenTheStackPopsTheValue_thenThe MinStack minStackImplementation = new MinStackImplementation(); int firstInValue = 10; minStackImplementation.push(firstInValue); - int previousMinValue = minStackImplementation.getMin(); int lastInValueBeingMinValue = 1; minStackImplementation.push(lastInValueBeingMinValue); @@ -109,6 +108,6 @@ public void getMin_whenTheTopValueIsMinValue_andWhenTheStackPopsTheValue_thenThe int minValueAfterPopping = minStackImplementation.getMin(); // Then - Assertions.assertThat(minValueAfterPopping).isEqualTo(previousMinValue); + Assertions.assertThat(minValueAfterPopping).isEqualTo(firstInValue); } } \ No newline at end of file From 7351e2e883156c4c890f22fb9a836f5d8dcd819a Mon Sep 17 00:00:00 2001 From: rikim Date: Sun, 3 May 2020 18:16:13 +0900 Subject: [PATCH 7/7] Extract valueStack.pop() as local var in pop() --- src/main/java/com/company/stack/MinStackImplementation.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/company/stack/MinStackImplementation.java b/src/main/java/com/company/stack/MinStackImplementation.java index 3e986fc..208f1d6 100644 --- a/src/main/java/com/company/stack/MinStackImplementation.java +++ b/src/main/java/com/company/stack/MinStackImplementation.java @@ -27,10 +27,11 @@ public void push(int number) { @Override public int pop() { - if (minStack.peek().equals(valueStack.peek())) { + int topValue = valueStack.pop(); + if (minStack.peek().equals(topValue)) { minStack.pop(); } - return valueStack.pop(); + return topValue; } @Override