Implement the following functions of stack data structure using standard operations of queue,
- push(x) –> Push an element x to the stack
- pop() –> Removes the element on top of stack
- top() –> Return the element on top of stack
- empty() –> Return whether the stack is empty
Table of Contents
Examples
Input:
stack.push(1);
stack.push(2);
stack.top(); // returns 2
stack.pop(); // returns 2
stack.empty(); // returns false
Output:
2
2
false
Algorithm for Implement Stack using Queues
A stack can be implemented using 2 queues (say q1 and q2).
push(x)
Push x at the end of q1 and keep it as the top of the stack in top variable.
Pseudo Code
void push(int x) { q1.add(x); top = x; }
Time Complexity= O(1)
top()
The top of the stack is always maintained in the top variable, so simply return the top.
Pseudo Code
int top() { return top; }
Time Complexity = O(1)
empty()
The stack is empty if the queue q1 is empty.
Pseudo Code
boolean empty() { return q1.isEmpty(); }
Time Complexity = O(1)
pop()
The rear of queue q1 contains the top of the stack, let the size of q1 be n
- Move (n – 1) elements of queue q1 to queue q2.
- Also, maintain the top of stack as the current variable being transferred.
- Now, q1 contains only 1 element that is top of the stack.
- Remove and store this element in some variable (say ele).
- Move all the elements from queue q2 to queue q1.
- Return ele.
Time Complexity= O(n)
where n is the number of elements in the queue.
Consider an example,
q1= 3 -> 5 -> 7 -> 1 -> 2
q2 = null
Pop out an element.
- Transfer (n – 1) from q1 to q2
q1 = 2 and q2=3 -> 5 -> 7 -> 1 - Remove and store the element in q1.
q1 = null and q2 =3 -> 5 -> 7 -> 1 and ele = 2 - Move all the elements from q2 to q1.
q1=3 -> 5 -> 7 -> 1 and q2 = null - Return ele.
See the image below for clarification.
Pseudo Code
int pop() { int n = q1.size(); for (int i = 0; i < n - 1; i++) { int curr = q1.remove(); q2.add(curr); top = curr; } int ele = q1.remove(); n = q2.size(); for (int i = 0; i < n; i++) { q1.add(q2.remove()); } return ele; }
Time Complexity = O(n)
JAVA Code for Implement Stack using Queues
import java.util.Queue; import java.util.LinkedList; public class StackUsingQueues { // Two queues to implement stack private static Queue<Integer> q1 = new LinkedList<>(); private static Queue<Integer> q2 = new LinkedList<>(); // Stores the top element of stack private static int top; private static void push(int x) { // Add element at rear of q1 q1.add(x); // update top as current element top = x; } private static int top() { // Top stores the top of stack return top; } private static int pop() { int n = q1.size(); // Shift (n - 1) elements from q1 to q2 and update top as curr // element transferred for (int i = 0; i < n - 1; i++) { int curr = q1.remove(); q2.add(curr); top = curr; } // q1 contains only 1 element which is top of stack // store the element in ele and remove it from q1 int ele = q1.remove(); n = q2.size(); // Again transfer back the elements from q2 to q1 for (int i = 0; i < n; i++) { q1.add(q2.remove()); } // return ele, this is the top of stack return ele; } private static boolean empty() { // If q1 is empty then stack is empty return q1.isEmpty(); } public static void main(String[] args) { // Example push(1); push(2); System.out.println(top()); System.out.println(pop()); System.out.println(empty()); } }
C++ Code for Implement Stack using Queues
#include <bits/stdc++.h> using namespace std; // Two queues to implement stack queue<int> q1; queue<int> q2; // Stores the top element of stack int Top; void push(int x) { // Add element at rear of q1 q1.push(x); // update top as current element Top = x; } int top() { // Top stores the top of stack return Top; } bool empty() { // If q1 is empty then stack is empty return q1.empty(); } int pop() { int n = q1.size(); // Shift (n - 1) elements from q1 to q2 and update top as curr // element transferred for (int i = 0; i < n - 1; i++) { int curr = q1.front(); q1.pop(); q2.push(curr); Top = curr; } // q1 contains only 1 element which is top of stack // store the element in ele and remove it from q1 int ele = q1.front(); q1.pop(); n = q2.size(); // Again transfer back the elements from q2 to q1 for (int i = 0; i < n; i++) { q1.push(q2.front()); q2.pop(); } // return ele, this is the top of stack return ele; } int main() { // Example push(1); push(2); cout<<top()<<endl; cout<<pop()<<endl; if (empty()) { cout<<"true"<<endl; } else { cout<<"false"<<endl; } return 0; }
2 2 false