Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions src/main/java/com/thealgorithms/stacks/PalindromeWithStack.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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));
}
}