mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-06 00:54:32 +08:00
Add palindrome checker using stack (#5887)
This commit is contained in:

committed by
GitHub

parent
0f8cda987d
commit
60060250ca
@ -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());
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user