Skip to content

Added palindrome checker using stack #5887

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Oct 22, 2024
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));
}
}