Add palindrome checker using stack (#5887)

This commit is contained in:
S M Jishanul Islam
2024-10-23 01:31:29 +06:00
committed by GitHub
parent 0f8cda987d
commit 60060250ca
2 changed files with 134 additions and 0 deletions

View File

@ -0,0 +1,57 @@
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 class PalindromeWithStack {
private LinkedList<Character> stack;
/**
* Constructs an empty stack that stores characters.
*/
public PalindromeWithStack() {
stack = new LinkedList<Character>();
}
/**
* 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 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) {
char c = lowercase.charAt(i);
// 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());
}
}

View File

@ -0,0 +1,77 @@
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));
}
@Test
public void testStringWithNumbers() {
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));
}
}