Open In App

Reverse a stack without using extra space in O(n)

Last Updated : 10 Jan, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Reverse a Stack without using recursion and extra space. Even the functional Stack is not allowed.

Examples:  

Input : 1->2->3->4
Output : 4->3->2->1

Input :  6->5->4
Output : 4->5->6

We have discussed a way of reversing a stack in the below post.
Reverse a Stack using Recursion

The above solution requires O(n) extra space. We can reverse a stack in O(1) time if we internally represent the stack as a linked list. Reverse a stack would require a reversing of a linked list which can be done with O(n) time and O(1) extra space.
Note that push() and pop() operations still take O(1) time.  

Implementation:

C++




// C++ program to implement Stack 
// using linked list so that reverse
// can be done with O(1) extra space.
#include<bits/stdc++.h>
using namespace std;
  
class StackNode {
    public:
    int data;
    StackNode *next;
      
    StackNode(int data)
    {
        this->data = data;
        this->next = NULL;
    }
};
  
class Stack {
      
    StackNode *top;
      
    public:
      
    // Push and pop operations
    void push(int data)
    {
        if (top == NULL) {
            top = new StackNode(data);
            return;
        }
        StackNode *s = new StackNode(data);
        s->next = top;
        top = s;
    }
      
    StackNode* pop()
    {
        StackNode *s = top;
        top = top->next;
        return s;
    }
  
    // prints contents of stack
    void display()
    {
        StackNode *s = top;
        while (s != NULL) {
            cout << s->data << " ";
            s = s->next;
        }
        cout << endl;
    }
  
    // Reverses the stack using simple
    // linked list reversal logic.
    void reverse()
    {
        StackNode *prev, *cur, *succ;
        cur = prev = top;
        cur = cur->next;
        prev->next = NULL;
        while (cur != NULL) {
  
            succ = cur->next;
            cur->next = prev;
            prev = cur;
            cur = succ;
        }
        top = prev;
    }
};
  
// driver code
int main()
{
    Stack *s = new Stack();
    s->push(1);
    s->push(2);
    s->push(3);
    s->push(4);
    cout << "Original Stack" << endl;;
    s->display();
    cout << endl;
      
    // reverse
    s->reverse();
  
    cout << "Reversed Stack" << endl;
    s->display();
      
    return 0;
}
// This code is contributed by Chhavi.


Java




// Java program to implement Stack using linked
// list so that reverse can be done with O(1) 
// extra space.
class StackNode {
    int data;
    StackNode next;
    public StackNode(int data)
    {
        this.data = data;
        this.next = null;
    }
}
  
class Stack {
    StackNode top;
  
    // Push and pop operations
    public void push(int data)
    {
        if (this.top == null) {
            top = new StackNode(data);
            return;
        }
        StackNode s = new StackNode(data);
        s.next = this.top;
        this.top = s;
    }
    public StackNode pop()
    {
        StackNode s = this.top;
        this.top = this.top.next;
        return s;
    }
  
    // prints contents of stack
    public void display()
    {
        StackNode s = this.top;
        while (s != null) {
            System.out.print(s.data + " ");
            s = s.next;
        }
        System.out.println();
    }
  
    // Reverses the stack using simple
    // linked list reversal logic.
    public void reverse()
    {
        StackNode prev, cur, succ;
        cur = prev = this.top;
        cur = cur.next;
        prev.next = null;
        while (cur != null) {
  
            succ = cur.next;
            cur.next = prev;
            prev = cur;
            cur = succ;
        }
        this.top = prev;
    }
}
  
public class reverseStackWithoutSpace {
    public static void main(String[] args)
    {
        Stack s = new Stack();
        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);
        System.out.println("Original Stack");
        s.display();
  
        // reverse
        s.reverse();
  
        System.out.println("Reversed Stack");
        s.display();
    }
}


Python3




# Python3 program to implement Stack 
# using linked list so that reverse
# can be done with O(1) extra space.
class StackNode:
      
    def __init__(self, data):
          
        self.data = data
        self.next = None
  
class Stack:
      
    def __init__(self):
           
        self.top = None
       
    # Push and pop operations
    def push(self, data):
      
        if (self.top == None):
            self.top = StackNode(data)
            return
          
        s = StackNode(data)
        s.next = self.top
        self.top = s
       
    def pop(self):
      
        s = self.top
        self.top = self.top.next
        return s
   
    # Prints contents of stack
    def display(self):
      
        s = self.top
          
        while (s != None):
            print(s.data, end = ' ')
            s = s.next
          
    # Reverses the stack using simple
    # linked list reversal logic.
    def reverse(self):
  
        prev = self.top
        cur = self.top
        cur = cur.next
        succ = None
        prev.next = None
          
        while (cur != None):
            succ = cur.next
            cur.next = prev
            prev = cur
            cur = succ
          
        self.top = prev
      
# Driver code
if __name__=='__main__':
      
    s = Stack()
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
      
    print("Original Stack")
    s.display()
    print()
       
    # Reverse
    s.reverse()
   
    print("Reversed Stack")
    s.display()
       
# This code is contributed by rutvik_56


C#




// C# program to implement Stack using linked
// list so that reverse can be done with O(1) 
// extra space.
using System; 
  
public class StackNode
{
    public int data;
    public StackNode next;
    public StackNode(int data)
    {
        this.data = data;
        this.next = null;
    }
}
  
public class Stack 
{
    public StackNode top;
  
    // Push and pop operations
    public void push(int data)
    {
        if (this.top == null)
        {
            top = new StackNode(data);
            return;
        }
        StackNode s = new StackNode(data);
        s.next = this.top;
        this.top = s;
    }
      
    public StackNode pop()
    {
        StackNode s = this.top;
        this.top = this.top.next;
        return s;
    }
  
    // prints contents of stack
    public void display()
    {
        StackNode s = this.top;
        while (s != null
        {
            Console.Write(s.data + " ");
            s = s.next;
        }
        Console.WriteLine();
    }
  
    // Reverses the stack using simple
    // linked list reversal logic.
    public void reverse()
    {
        StackNode prev, cur, succ;
        cur = prev = this.top;
        cur = cur.next;
        prev.next = null;
        while (cur != null)
        {
            succ = cur.next;
            cur.next = prev;
            prev = cur;
            cur = succ;
        }
        this.top = prev;
    }
}
  
public class reverseStackWithoutSpace 
{
    // Driver code
    public static void Main(String []args)
    {
        Stack s = new Stack();
        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);
        Console.WriteLine("Original Stack");
        s.display();
  
        // reverse
        s.reverse();
  
        Console.WriteLine("Reversed Stack");
        s.display();
    }
}
  
// This code is contributed by Arnab Kundu


Javascript




<script>
  
// JavaScript program to implement Stack 
// using linked list so that reverse can 
// be done with O(1) extra space.
class StackNode 
{
    constructor(data) 
    {
        this.data = data;
        this.next = null;
    }
}
  
class Stack 
{
    top = null;
      
    // Push and pop operations
    push(data)
    {
        if (this.top == null
        {
            this.top = new StackNode(data);
            return;
        }
        var s = new StackNode(data);
        s.next = this.top;
        this.top = s;
    }
      
    pop() 
    {
        var s = this.top;
        this.top = this.top.next;
        return s;
    }
      
    // Prints contents of stack
    display() 
    {
        var s = this.top;
        while (s != null)
        {
            document.write(s.data + " ");
            s = s.next;
        }
        document.write("<br>");
    }
      
    // Reverses the stack using simple
    // linked list reversal logic.
    reverse() 
    {
        var prev, cur, succ;
        cur = prev = this.top;
        cur = cur.next;
        prev.next = null;
          
        while (cur != null
        {
            succ = cur.next;
            cur.next = prev;
            prev = cur;
            cur = succ;
        }
        this.top = prev;
    }
}
  
// Driver code
var s = new Stack();
s.push(1);
s.push(2);
s.push(3);
s.push(4);
document.write("Original Stack <br>");
s.display();
  
// Reverse
s.reverse();
  
document.write("Reversed Stack <br>");
s.display();
  
// This code is contributed by rdtank
  
</script>


Output

Original Stack
4 3 2 1 

Reversed Stack
1 2 3 4 

Time Complexity: O(n), as we are using a loop to traverse n times. Where n is the number of nodes in the linked list.
Auxiliary Space: O(1), as we are not using any extra space.

 



Previous Article
Next Article

Similar Reads

Clone a stack without using extra space | Set 2
Given a stack S, the task is to copy the content of the given stack S to another stack T maintaining the same order. Examples: Input: Source:- |5| |4| |3| |2| |1|Output: Destination:- |5| |4| |3| |2| |1| Input: Source:- |12| |13| |14| |15| |16|Output: Destination:- |12| |13| |14| |15| |16| Reversing the Stack-Based Approach: Please refer to the pre
7 min read
Print reverse of a Linked List without extra space and modifications
Given a Linked List, display the linked list in reverse without using recursion, stack or modifications to given list. Examples: Input: 1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;NULLOutput: 5 4 3 2 1 Input: 10-&gt;5-&gt;15-&gt;20-&gt;24-&gt;NULLOutput: 24 20 15 5 10 Below are different solutions that are now allowed here as we cannot use extra space and modify
7 min read
Clone a stack without extra space
Given a source stack, copy the contents of the source stack to the destination stack maintaining the same order without using extra space. Examples: Input : Source:- |3| |2| |1|Output : Destination:- |3| |2| |1|Input : Source:- |a| |b| |c|Output : Destination:- |a| |b| |c|Approach: In order to solve this without using extra space, we first reverse
15 min read
Create Balanced Binary Tree using its Leaf Nodes without using extra space
Prerequisites: Binary Tree to Doubly Linked ListGiven a Binary Tree, the task is to create a Balanced Binary Tree from all the leaf nodes of the given Binary Tree. Examples: Input: Output: 7 8 5 9 10 Explanation: Required balanced binary tree will be: Input: Output: 13 21 29 7 15 Explanation: Required balanced binary tree is: 29 / \ 21 7 / \ 13 15
15 min read
Design a dynamic stack using arrays that supports getMin() in O(1) time and O(1) extra space
Design a special dynamic Stack using an array that supports all the stack operations such as push(), pop(), peek(), isEmpty(), and getMin() operations in constant Time and Space complexities. Examples: Assuming the right to left orientation as the top to bottom orientation and performing the operations: Push(10): 10 is added to the top of the stack
15+ min read
Shuffle 2n integers as a1-b1-a2-b2-a3-b3-..bn without using extra space
We have an array of the form {a0, a1, a2....., an, b0, b1, b2, .....bn} and our task is to rearrange the same in theform given below by using O(1) space- {a0, b0, a1, b1, a2, b2...........an, bn} Examples: Input : arr[] = {1, 3, 5, 7, 2, 4, 6, 8} Output : {1, 2, 3, 4, 5, 6, 7, 8} Input : arr[] = {11, 13, 15, 12, 14, 16} Output : {11, 12, 13, 14, 15
11 min read
Rotate a matrix by 90 degree in clockwise direction without using any extra space
Given a square matrix, turn it by 90 degrees in a clockwise direction without using any extra space. Examples: Input: 1 2 3 4 5 6 7 8 9 Output: 7 4 1 8 5 2 9 6 3 Input: 1 2 3 4 Output: 3 1 4 2 Method 1 Approach: The approach is similar to Inplace rotate square matrix by 90 degrees | Set 1. The only thing that is different is to print the elements o
15+ min read
Shuffle 2n integers as a1-b1-a2-b2-a3-b3-..bn without using extra space | Set 2
Given an array arr[] consisting of 2* N elements in the form of { a1, a2, …, aN, b1, b2, ..., bN }, the task is to shuffle the array to {a1, b1, a2, b2, ..., an, b1} without using extra space. Examples : Input: arr[] = { 1, 3, 5, 2, 4, 6 }Output: 1 2 3 4 5 6Explanation: The output contains the elements in the form of { a1, b1, a2, b2, a3, b3 }. Inp
15 min read
Rotate a matrix clockwise by 90 degree without using any extra space | Set 3
Given a rectangular matrix mat[][] with N rows and M columns, the task is to rotate the matrix by 90 degrees in a clockwise direction without using extra space. Examples: Input: mat[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}Output: 10 7 4 1 11 8 5 2 12 9 6 3 Input: mat[][] = {{1, 2, 3, 4, 5, 6}, {7, 8, 9, 10, 11, 12}}Output: 7 1 8 2 9 3
10 min read
Check if a number is palindrome or not without using any extra space | Set 2
Given a number ‘n’ and our goal is to find out it is palindrome or not without using any extra space. We can’t make a new copy of number. Examples: Input: n = 2332Output: Yes it is Palindrome.Explanation:original number = 2332reversed number = 2332Both are same hence the number is palindrome. Input: n=1111Output: Yes it is Palindrome. Input: n = 12
5 min read
Article Tags :
Practice Tags :