mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-05 16:27:33 +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