Reverse an array using Stack
Given an array arr[] of size N, the task to reverse the array using Stack.
Examples:
Input: arr[] = { 10, 20, 30, 40, 50 }
Output: 50 40 30 20 10
Explanation: Reversing the array modifies arr[] to { 50, 40, 30, 20, 10 } Therefore, the required output is 50 40 30 20 10.
Input: arr[] = { 1 }
Output: 1
Iterative and Recursive Approach: Refer the article reverse an array to solve this problem iteratively or recursively. Time Complexity: O(N) Auxiliary Space: O(1)
Stack-based Approach: Follow the steps below to solve the problem:
Below is the implementation of the above approach
C
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stack {
int top;
unsigned capacity;
int * array;
};
struct Stack* createStack(unsigned capacity)
{
struct Stack* stack
= ( struct Stack*) malloc (
sizeof ( struct Stack));
stack->capacity = capacity;
stack->top = -1;
stack->array
= ( int *) malloc (
stack->capacity
* sizeof ( int ));
return stack;
}
int isFull( struct Stack* stack)
{
return stack->top
== stack->capacity - 1;
}
int isEmpty( struct Stack* stack)
{
return stack->top == -1;
}
void push( struct Stack* stack, int item)
{
if (isFull(stack))
return ;
stack->array[++stack->top] = item;
}
int pop( struct Stack* stack)
{
if (isEmpty(stack))
return -1;
return stack->array[stack->top--];
}
void reverseArray( int arr[], int n)
{
struct Stack* stack = createStack(n);
for ( int i = 0; i < n; i++) {
push(stack, arr[i]);
}
for ( int i = 0; i < n; i++) {
arr[i] = pop(stack);
}
for ( int i = 0; i < n; i++)
printf ( "%d " , arr[i]);
}
int main()
{
int arr[] = { 100, 200, 300, 400 };
int N = sizeof (arr) / sizeof (arr[0]);
reverseArray(arr, N);
return 0;
}
|
C++
#include <bits/stdc++.h>
using namespace std;
class Stack {
public :
int top;
unsigned capacity;
int * array;
};
Stack* createStack(unsigned capacity)
{
Stack* stack = new Stack();
stack->capacity = capacity;
stack->top = -1;
stack->array = new int [(stack->capacity
* sizeof ( int ))];
return stack;
}
int isFull(Stack* stack)
{
return stack->top
== stack->capacity - 1;
}
int isEmpty(Stack* stack)
{
return stack->top == -1;
}
void push(Stack* stack, int item)
{
if (isFull(stack))
return ;
stack->array[++stack->top] = item;
}
int pop(Stack* stack)
{
if (isEmpty(stack))
return -1;
return stack->array[stack->top--];
}
void reverseArray( int arr[], int n)
{
Stack* stack = createStack(n);
for ( int i = 0; i < n; i++) {
push(stack, arr[i]);
}
for ( int i = 0; i < n; i++) {
arr[i] = pop(stack);
}
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
}
int main()
{
int arr[] = { 100, 200, 300, 400 };
int N = sizeof (arr) / sizeof (arr[0]);
reverseArray(arr, N);
return 0;
}
|
Java
import java.util.*;
class Stack {
int size;
int top;
int [] a;
boolean isEmpty()
{
return (top < 0 );
}
Stack( int n)
{
top = - 1 ;
size = n;
a = new int [size];
}
boolean push( int x)
{
if (top >= size) {
System.out.println(
"Stack Overflow" );
return false ;
}
else {
a[++top] = x;
return true ;
}
}
int pop()
{
if (top < 0 ) {
System.out.println(
"Stack Underflow" );
return 0 ;
}
else {
int x = a[top--];
return x;
}
}
}
class Main {
public static void reverse( int arr[], int n)
{
Stack obj = new Stack(n);
for ( int i = 0 ; i < n; i++) {
obj.push(arr[i]);
}
for ( int i = 0 ; i < n; i++) {
arr[i] = obj.pop();
}
for ( int i = 0 ; i < n; i++) {
System.out.print(arr[i] + " " );
}
}
public static void main(String args[])
{
int n = 4 ;
int [] a = new int [] { 100 , 200 , 300 , 400 };
reverse(a, n);
}
}
|
C#
using System;
class Stack
{
int size;
int top;
int [] a;
public bool IsEmpty()
{
return (top < 0);
}
public Stack( int n)
{
top = -1;
size = n;
a = new int [size];
}
public bool Push( int x)
{
if (top >= size)
{
Console.WriteLine( "Stack Overflow" );
return false ;
}
else
{
a[++top] = x;
return true ;
}
}
public int Pop()
{
if (top < 0)
{
Console.WriteLine( "Stack Underflow" );
return 0;
}
else
{
int x = a[top--];
return x;
}
}
}
class MainClass
{
public static void Reverse( int [] arr, int n)
{
Stack obj = new Stack(n);
for ( int i = 0; i < n; i++)
{
obj.Push(arr[i]);
}
for ( int i = 0; i < n; i++)
{
arr[i] = obj.Pop();
}
for ( int i = 0; i < n; i++)
{
Console.Write(arr[i] + " " );
}
}
public static void Main()
{
int n = 4;
int [] a = new int [] { 100, 200, 300, 400 };
Reverse(a, n);
}
}
|
Javascript
class Stack {
constructor(capacity) {
this .top = -1;
this .capacity = capacity;
this .array = new Array(capacity);
}
}
function isFull(stack) {
return stack.top == stack.capacity - 1;
}
function isEmpty(stack) {
return stack.top == -1;
}
function push(stack, item) {
if (isFull(stack)) return ;
stack.array[++stack.top] = item;
}
function pop(stack) {
if (isEmpty(stack)) return -1;
return stack.array[stack.top--];
}
function reverseArray(arr, n) {
const stack = new Stack(n);
for (let i = 0; i < n; i++) {
push(stack, arr[i]);
}
for (let i = 0; i < n; i++) {
arr[i] = pop(stack);
}
console.log(arr.join( ' ' ));
}
function main() {
const arr = [100, 200, 300, 400];
const N = arr.length;
reverseArray(arr, N);
}
main();
|
Approach 2: Using STL
To minimize the code we can simply use the STL Stack ( #include <stack> )
C++
#include <iostream>
#include <stack> // including Stack ( push, pop, empty, size... etc)
using namespace std;
void reverse( int arr[] , int n){
stack< int >st;
for ( int i=0 ;i<n ;i++){
st.push(arr[i]);
}
int i=0;
while (!st.empty()){
int top = st.top();
st.pop();
arr[i] = top;
i++;
}
for ( int i=0 ;i<n ;i++){
cout << arr[i] << " " ;
}
return ;
}
int main() {
int n = 4;
int arr[] ={ 100, 200, 300, 400 };
reverse(arr, n);
return 0;
}
|
Java
import java.util.*;
class Main {
public static void reverse( int arr[], int n)
{
Stack<Integer> st = new Stack<>();
for ( int i= 0 ;i<n ;i++){
st.push(arr[i]);
}
int i= 0 ;
while (st.empty()== false ){
int top = st.peek();
st.pop();
arr[i] = top;
i++;
}
for (i= 0 ;i<n ;i++){
System.out.print(arr[i]+ " " );
}
}
public static void main(String args[])
{
int n = 4 ;
int [] a = new int [] { 100 , 200 , 300 , 400 };
reverse(a, n);
}
}
|
Python3
def reverse(arr, n):
st = []
for i in range (n):
st.append(arr[i])
i = 0
while ( len (st) > 0 ):
top = st.pop()
arr[i] = top
i + = 1
for i in range (n):
print (arr[i], end = " " )
n = 4
arr = [ 100 , 200 , 300 , 400 ]
reverse(arr, n)
|
C#
using System;
using System.Collections.Generic;
class MainClass
{
public static void Reverse( int [] arr, int n)
{
Stack< int > st = new Stack< int >();
for ( int i = 0; i < n; i++)
{
st.Push(arr[i]);
}
for ( int i = 0; i < n; i++)
{
int top = st.Peek();
st.Pop();
arr[i] = top;
}
for ( int i = 0; i < n; i++)
{
Console.Write(arr[i] + " " );
}
}
public static void Main()
{
int n = 4;
int [] a = new int [] { 100, 200, 300, 400 };
Reverse(a, n);
}
}
|
Javascript
function reverse(arr, n) {
const st = [];
for (let i = 0; i < n; i++) {
st.push(arr[i]);
}
let i = 0;
while (st.length)
{
const top = st.pop();
arr[i] = top;
i++;
}
for (let i = 0; i < n; i++) {
console.log(arr[i] + " " );
}
}
const n = 4;
const arr = [100, 200, 300, 400];
reverse(arr, n);
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Last Updated :
31 Mar, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...