From b193a0a1dd264c47f33ec8d28328205788fb4577 Mon Sep 17 00:00:00 2001 From: S-M-J-I Date: Fri, 18 Oct 2024 14:58:18 +0600 Subject: [PATCH 1/4] added palindrome checker using stack --- .../stacks/PalindromeWithStack.java | 59 +++++++++++++++++++ .../stacks/PalindromeWithStackTest.java | 59 +++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java create mode 100644 src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java diff --git a/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java b/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java new file mode 100644 index 000000000000..c21c1aae588b --- /dev/null +++ b/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java @@ -0,0 +1,59 @@ +package com.thealgorithms.stacks; + +import java.util.LinkedList; + +/** + * A class that implements a palindrome checker using a stack. + * The stack is used to store the characters of the string, + * which we will pop one-by-one to create the string in reverse. + * + * Reference: https://www.geeksforgeeks.org/check-whether-the-given-string-is-palindrome-using-stack/ + */ +public final class PalindromeWithStack { + private LinkedList stack; + + /** + * Constructs an empty stack that stores characters. + */ + public PalindromeWithStack() { + stack = new LinkedList(); + } + + /** + * Check if the string is a palindrome or not. + * Convert all characters to lowercase and push them into a stack. + * At the same time, build a string + * Next, pop from the stack and build the reverse string + * Finally, compare these two strings + * + * @param string The string to check if it is palindrome or not. + */ + public final boolean checkPalindrome(final String string) { + // Create a StringBuilder to build the string from left to right + StringBuilder stringBuilder = new StringBuilder(string.length()); + // Convert all characters to lowercase + String lowercase = string.toLowerCase(); + + // Iterate through the string + for(int i = 0; i < lowercase.length(); ++i) { + char c = lowercase.charAt(i); + if (c >= 'a' && c <= 'z') { + // Build the string from L->R + stringBuilder.append(c); + // Push to the stack + stack.push(c); + } + } + + // The stack contains the reverse order of the string + StringBuilder reverseString = new StringBuilder(stack.size()); + // Until the stack is not empty + while (!stack.isEmpty()){ + // Build the string from R->L + reverseString.append(stack.pop()); + } + + // Finally, compare the L->R string with the R->L string + return reverseString.toString().equals(stringBuilder.toString()); + } +} diff --git a/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java b/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java new file mode 100644 index 000000000000..08ca1a1bb449 --- /dev/null +++ b/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java @@ -0,0 +1,59 @@ +package com.thealgorithms.stacks; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class PalindromeWithStackTest { + + private PalindromeWithStack palindromeChecker; + + @BeforeEach + public void setUp() { + palindromeChecker = new PalindromeWithStack(); + } + + @Test + public void testValidOne() { + String testString = "Racecar"; + assertTrue(palindromeChecker.checkPalindrome(testString)); + } + + @Test + public void testInvalidOne() { + String testString = "James"; + assertFalse(palindromeChecker.checkPalindrome(testString)); + } + + @Test + public void testValidTwo() { + String testString = "madam"; + assertTrue(palindromeChecker.checkPalindrome(testString)); + } + + @Test + public void testInvalidTwo() { + String testString = "pantry"; + assertFalse(palindromeChecker.checkPalindrome(testString)); + } + + @Test + public void testValidThree() { + String testString = "RaDar"; + assertTrue(palindromeChecker.checkPalindrome(testString)); + } + + @Test + public void testInvalidThree() { + String testString = "Win"; + assertFalse(palindromeChecker.checkPalindrome(testString)); + } + + @Test + public void testBlankString() { + String testString = ""; + assertTrue(palindromeChecker.checkPalindrome(testString)); + } +} From 13c0e4cf3d4a49e747fc083b7cb631854d3eb22d Mon Sep 17 00:00:00 2001 From: S-M-J-I Date: Fri, 18 Oct 2024 15:01:59 +0600 Subject: [PATCH 2/4] added palindrome checker using stack --- .../com/thealgorithms/stacks/PalindromeWithStack.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java b/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java index c21c1aae588b..a4f71bb112da 100644 --- a/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java +++ b/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java @@ -9,7 +9,7 @@ * * Reference: https://www.geeksforgeeks.org/check-whether-the-given-string-is-palindrome-using-stack/ */ -public final class PalindromeWithStack { +public class PalindromeWithStack { private LinkedList stack; /** @@ -28,14 +28,14 @@ public PalindromeWithStack() { * * @param string The string to check if it is palindrome or not. */ - public final boolean checkPalindrome(final String string) { + public boolean checkPalindrome(String string) { // Create a StringBuilder to build the string from left to right StringBuilder stringBuilder = new StringBuilder(string.length()); // Convert all characters to lowercase String lowercase = string.toLowerCase(); // Iterate through the string - for(int i = 0; i < lowercase.length(); ++i) { + for (int i = 0; i < lowercase.length(); ++i) { char c = lowercase.charAt(i); if (c >= 'a' && c <= 'z') { // Build the string from L->R @@ -48,7 +48,7 @@ public final boolean checkPalindrome(final String string) { // The stack contains the reverse order of the string StringBuilder reverseString = new StringBuilder(stack.size()); // Until the stack is not empty - while (!stack.isEmpty()){ + while (!stack.isEmpty()) { // Build the string from R->L reverseString.append(stack.pop()); } From 7611b34288514c189267ab1e8f7a23dda4ecb6c6 Mon Sep 17 00:00:00 2001 From: S-M-J-I Date: Fri, 18 Oct 2024 15:03:49 +0600 Subject: [PATCH 3/4] added test case to check numbers --- .../com/thealgorithms/stacks/PalindromeWithStackTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java b/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java index 08ca1a1bb449..5db3fa9da8e1 100644 --- a/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java +++ b/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java @@ -56,4 +56,10 @@ public void testBlankString() { String testString = ""; assertTrue(palindromeChecker.checkPalindrome(testString)); } + + @Test + public void testStringWithNumbers() { + String testString = "bio123ib"; + assertTrue(palindromeChecker.checkPalindrome(testString)); + } } From aa13b819fc5c22812047395bd0f6b915ecc58c96 Mon Sep 17 00:00:00 2001 From: S-M-J-I Date: Fri, 18 Oct 2024 18:50:34 +0600 Subject: [PATCH 4/4] added number scopes. added test case coverage --- .../thealgorithms/stacks/PalindromeWithStack.java | 10 ++++------ .../stacks/PalindromeWithStackTest.java | 14 +++++++++++++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java b/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java index a4f71bb112da..98c439341a21 100644 --- a/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java +++ b/src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java @@ -37,12 +37,10 @@ public boolean checkPalindrome(String string) { // Iterate through the string for (int i = 0; i < lowercase.length(); ++i) { char c = lowercase.charAt(i); - if (c >= 'a' && c <= 'z') { - // Build the string from L->R - stringBuilder.append(c); - // Push to the stack - stack.push(c); - } + // Build the string from L->R + stringBuilder.append(c); + // Push to the stack + stack.push(c); } // The stack contains the reverse order of the string diff --git a/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java b/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java index 5db3fa9da8e1..47b21d5e9e9c 100644 --- a/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java +++ b/src/test/java/com/thealgorithms/stacks/PalindromeWithStackTest.java @@ -59,7 +59,19 @@ public void testBlankString() { @Test public void testStringWithNumbers() { - String testString = "bio123ib"; + String testString = "12321"; + assertTrue(palindromeChecker.checkPalindrome(testString)); + } + + @Test + public void testStringWithNumbersTwo() { + String testString = "12325"; + assertFalse(palindromeChecker.checkPalindrome(testString)); + } + + @Test + public void testStringWithNumbersAndLetters() { + String testString = "po454op"; assertTrue(palindromeChecker.checkPalindrome(testString)); } }