Skip to content

refactor: ReverseStackUsingRecursion #5386

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 3 commits into from
Aug 25, 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
Original file line number Diff line number Diff line change
@@ -1,63 +1,44 @@
package com.thealgorithms.others;

/* Program to reverse a Stack using Recursion*/
import java.util.Stack;

/**
* Class that provides methods to reverse a stack using recursion.
*/
public final class ReverseStackUsingRecursion {
private ReverseStackUsingRecursion() {
}

// Stack
private static Stack<Integer> stack = new Stack<>();

// Main function
public static void main(String[] args) {
// To Create a Dummy Stack containing integers from 0-9
for (int i = 0; i < 10; i++) {
stack.push(i);
}
System.out.println("STACK");

// To print that dummy Stack
for (int k = 9; k >= 0; k--) {
System.out.println(k);
/**
* Reverses the elements of the given stack using recursion.
*
* @param stack the stack to be reversed
* @throws IllegalArgumentException if the stack is null
*/
public static void reverse(Stack<Integer> stack) {
if (stack == null) {
throw new IllegalArgumentException("Stack cannot be null");
}

// Reverse Function called
reverseUsingRecursion(stack);

System.out.println("REVERSED STACK : ");
// To print reversed stack
while (!stack.isEmpty()) {
System.out.println(stack.pop());
if (!stack.isEmpty()) {
int topElement = stack.pop();
reverse(stack);
insertAtBottom(stack, topElement);
}
}

// Function Used to reverse Stack Using Recursion
private static void reverseUsingRecursion(Stack<Integer> stack) {
if (stack.isEmpty()) { // If stack is empty then return
return;
}
/* All items are stored in call stack until we reach the end*/

int temptop = stack.peek();
stack.pop();
reverseUsingRecursion(stack); // Recursion call
insertAtEnd(temptop); // Insert items held in call stack one by one into stack
}

// Function used to insert element at the end of stack
private static void insertAtEnd(int temptop) {
/**
* Inserts an element at the bottom of the given stack.
*
* @param stack the stack where the element will be inserted
* @param element the element to be inserted at the bottom
*/
private static void insertAtBottom(Stack<Integer> stack, int element) {
if (stack.isEmpty()) {
stack.push(temptop); // If stack is empty push the element
stack.push(element);
} else {
int temp = stack.peek();
/* All the items are stored in call stack until we reach end*/
stack.pop();

insertAtEnd(temptop); // Recursive call

stack.push(temp);
int topElement = stack.pop();
insertAtBottom(stack, element);
stack.push(topElement);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.thealgorithms.others;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.Stack;
import org.junit.jupiter.api.Test;

public class ReverseStackUsingRecursionTest {

@Test
void testReverseWithMultipleElements() {
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < 5; i++) {
stack.push(i);
}

ReverseStackUsingRecursion.reverse(stack);

for (int i = 0; i < 5; i++) {
assertEquals(i, stack.pop());
}
assertTrue(stack.isEmpty());
}

@Test
void testReverseWithSingleElement() {
Stack<Integer> stack = new Stack<>();
stack.push(1);

ReverseStackUsingRecursion.reverse(stack);

assertEquals(1, stack.pop());
assertTrue(stack.isEmpty());
}

@Test
void testReverseWithEmptyStack() {
Stack<Integer> stack = new Stack<>();

ReverseStackUsingRecursion.reverse(stack);

assertTrue(stack.isEmpty());
}

@Test
void testReverseWithNullStack() {
Stack<Integer> stack = null;

Exception exception = assertThrows(IllegalArgumentException.class, () -> ReverseStackUsingRecursion.reverse(stack));

String expectedMessage = "Stack cannot be null";
String actualMessage = exception.getMessage();

assertTrue(actualMessage.contains(expectedMessage));
}
}