Implement a stack using singly linked list
Last Updated :
31 Jul, 2024
To implement a stack using the singly linked list concept, all the singly linked list operations should be performed based on Stack operations LIFO(last in first out) and with the help of that knowledge, we are going to implement a stack using a singly linked list.
So we need to follow a simple rule in the implementation of a stack which is last in first out and all the operations can be performed with the help of a top variable. Let us learn how to perform Pop, Push, Peek, and Display operations in the following article:
In the stack Implementation, a stack contains a top pointer. which is the “head” of the stack where pushing and popping items happens at the head of the list. The first node has a null in the link field and second node-link has the first node address in the link field and so on and the last node address is in the “top” pointer.
The main advantage of using a linked list over arrays is that it is possible to implement a stack that can shrink or grow as much as needed. Using an array will put a restriction on the maximum capacity of the array which can lead to stack overflow. Here each new node will be dynamically allocated. so overflow is not possible.
Stack Operations:
- push(): Insert a new element into the stack i.e just insert a new element at the beginning of the linked list.
- pop(): Return the top element of the Stack i.e simply delete the first element from the linked list.
- peek(): Return the top element.
- display(): Print all elements in Stack.
Push Operation:
- Initialise a node
- Update the value of that node by data i.e. node->data = data
- Now link this node to the top of the linked list
- And update top pointer to the current node
Pop Operation:
- First Check whether there is any node present in the linked list or not, if not then return
- Otherwise make pointer let say temp to the top node and move forward the top node by 1 step
- Now free this temp node
Peek Operation:
- Check if there is any node present or not, if not then return.
- Otherwise return the value of top node of the linked list
Display Operation:
- Take a temp node and initialize it with top pointer
- Now start traversing temp till it encounters NULL
- Simultaneously print the value of the temp node
Below is the implementation of the above operations
C++
// C++ program to implement a stack using singly linked list
#include <bits/stdc++.h>
using namespace std;
// Class representing a node in the linked list
class Node {
public:
int data;
Node* next;
Node(int new_data) {
this->data = new_data;
this->next = nullptr;
}
};
// Class to implement stack using a singly linked list
class Stack {
// head of the linked list
Node* head;
public:
// Constructor to initialize the stack
Stack() { this->head = nullptr; }
// Function to check if the stack is empty
bool isEmpty() {
// If head is nullptr, the stack is empty
return head == nullptr;
}
// Function to push an element onto the stack
void push(int new_data) {
// Create a new node with given data
Node* new_node = new Node(new_data);
// Check if memory allocation for the new node
// failed
if (!new_node) {
cout << "\nStack Overflow";
}
// Link the new node to the current top node
new_node->next = head;
// Update the top to the new node
head = new_node;
}
// Function to remove the top element from the stack
void pop() {
// Check for stack underflow
if (this->isEmpty()) {
cout << "\nStack Underflow" << endl;
}
else {
// Assign the current top to a temporary
// variable
Node* temp = head;
// Update the top to the next node
head = head->next;
// Deallocate the memory of the old top node
delete temp;
}
}
// Function to return the top element of the stack
int peek() {
// If stack is not empty, return the top element
if (!isEmpty())
return head->data;
else {
cout << "\nStack is empty";
return INT_MIN;
}
}
};
// Driver program to test the stack implementation
int main() {
// Creating a stack
Stack st;
// Push elements onto the stack
st.push(11);
st.push(22);
st.push(33);
st.push(44);
// Print top element of the stack
cout << "Top element is " << st.peek() << endl;
// removing two elemements from the top
cout << "Removing two elements..." << endl;
st.pop();
st.pop();
// Print top element of the stack
cout << "Top element is " << st.peek() << endl;
return 0;
}
C
// C program to implement a stack using singly linked list
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
// Struct representing a node in the linked list
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* createNode(int new_data) {
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = new_data;
new_node->next = NULL;
return new_node;
}
// Struct to implement stack using a singly linked list
typedef struct Stack {
Node* head;
} Stack;
// Constructor to initialize the stack
void initializeStack(Stack* stack) { stack->head = NULL; }
// Function to check if the stack is empty
int isEmpty(Stack* stack) {
// If head is NULL, the stack is empty
return stack->head == NULL;
}
// Function to push an element onto the stack
void push(Stack* stack, int new_data) {
// Create a new node with given data
Node* new_node = createNode(new_data);
// Check if memory allocation for the new node failed
if (!new_node) {
printf("\nStack Overflow");
return;
}
// Link the new node to the current top node
new_node->next = stack->head;
// Update the top to the new node
stack->head = new_node;
}
// Function to remove the top element from the stack
void pop(Stack* stack) {
// Check for stack underflow
if (isEmpty(stack)) {
printf("\nStack Underflow\n");
return;
}
else {
// Assign the current top to a temporary variable
Node* temp = stack->head;
// Update the top to the next node
stack->head = stack->head->next;
// Deallocate the memory of the old top node
free(temp);
}
}
// Function to return the top element of the stack
int peek(Stack* stack) {
// If stack is not empty, return the top element
if (!isEmpty(stack))
return stack->head->data;
else {
printf("\nStack is empty");
return INT_MIN;
}
}
// Driver program to test the stack implementation
int main() {
// Creating a stack
Stack stack;
initializeStack(&stack);
// Push elements onto the stack
push(&stack, 11);
push(&stack, 22);
push(&stack, 33);
push(&stack, 44);
// Print top element of the stack
printf("Top element is %d\n", peek(&stack));
// removing two elemements from the top
printf("Removing two elements...\n");
pop(&stack);
pop(&stack);
// Print top element of the stack
printf("Top element is %d\n", peek(&stack));
return 0;
}
Java
// Java program to implement a stack using singly linked
// list
// Class representing a node in the linked list
class Node {
int data;
Node next;
Node(int new_data) {
this.data = new_data;
this.next = null;
}
}
// Class to implement stack using a singly linked list
class Stack {
// Head of the linked list
Node head;
// Constructor to initialize the stack
Stack() { this.head = null; }
// Function to check if the stack is empty
boolean isEmpty() {
// If head is null, the stack is empty
return head == null;
}
// Function to push an element onto the stack
void push(int new_data) {
// Create a new node with given data
Node new_node = new Node(new_data);
// Check if memory allocation for the new node
// failed
if (new_node == null) {
System.out.println("\nStack Overflow");
return;
}
// Link the new node to the current top node
new_node.next = head;
// Update the top to the new node
head = new_node;
}
// Function to remove the top element from the stack
void pop() {
// Check for stack underflow
if (isEmpty()) {
System.out.println("\nStack Underflow");
return;
}
else {
// Assign the current top to a temporary
// variable
Node temp = head;
// Update the top to the next node
head = head.next;
// Deallocate the memory of the old top node
temp = null;
}
}
// Function to return the top element of the stack
int peek() {
// If stack is not empty, return the top element
if (!isEmpty())
return head.data;
else {
System.out.println("\nStack is empty");
return Integer.MIN_VALUE;
}
}
}
// Driver code
public class Main {
public static void main(String[] args)
{
// Creating a stack
Stack st = new Stack();
// Push elements onto the stack
st.push(11);
st.push(22);
st.push(33);
st.push(44);
// Print top element of the stack
System.out.println("Top element is " + st.peek());
// removing two elemements from the top
System.out.println("Removing two elements...");
st.pop();
st.pop();
// Print top element of the stack
System.out.println("Top element is " + st.peek());
}
}
Python
# Java program to implement a stack using singly linked
# list
# Class representing a node in the linked list
class Node:
def __init__(self, new_data):
self.data = new_data
self.next = None
# Class to implement stack using a singly linked list
class Stack:
def __init__(self):
# head of the linked list
self.head = None
# Function to check if the stack is empty
def is_empty(self):
# If head is None, the stack is empty
return self.head is None
# Function to push an element onto the stack
def push(self, new_data):
# Create a new node with given data
new_node = Node(new_data)
# Check if memory allocation for the new node failed
if not new_node:
print("\nStack Overflow")
return
# Link the new node to the current top node
new_node.next = self.head
# Update the top to the new node
self.head = new_node
# Function to remove the top element from the stack
def pop(self):
# Check for stack underflow
if self.is_empty():
print("\nStack Underflow")
else:
# Assign the current top to a temporary variable
temp = self.head
# Update the top to the next node
self.head = self.head.next
# Deallocate the memory of the old top node
del temp
# Function to return the top element of the stack
def peek(self):
# If stack is not empty, return the top element
if not self.is_empty():
return self.head.data
else:
print("\nStack is empty")
return float('-inf')
# Creating a stack
st = Stack()
# Push elements onto the stack
st.push(11)
st.push(22)
st.push(33)
st.push(44)
# Print top element of the stack
print("Top element is", st.peek())
# removing two elemements from the top
print("Removing two elements...");
st.pop()
st.pop()
# Print top element of the stack
print("Top element is", st.peek())
C#
// C# program to implement a stack using singly linked list
using System;
// Class representing a node in the linked list
class Node {
public int data;
public Node next;
public Node(int new_data)
{
this.data = new_data;
this.next = null;
}
}
// Class to implement stack using a singly linked list
class Stack {
// head of the linked list
private Node head;
// Constructor to initialize the stack
public Stack() { this.head = null; }
// Function to check if the stack is empty
public bool isEmpty()
{
// If head is null, the stack is empty
return head == null;
}
// Function to push an element onto the stack
public void push(int new_data)
{
// Create a new node with given data
Node new_node = new Node(new_data);
// Check if memory allocation for the new node
// failed
if (new_node == null) {
Console.WriteLine("\nStack Overflow");
return;
}
// Link the new node to the current top node
new_node.next = head;
// Update the top to the new node
head = new_node;
}
// Function to remove the top element from the stack
public void pop()
{
// Check for stack underflow
if (this.isEmpty()) {
Console.WriteLine("\nStack Underflow");
}
else {
// Update the top to the next node
head = head.next;
/* No need to manually free the memory of the
* old head in C# */
}
}
// Function to return the top element of the stack
public int peek()
{
// If stack is not empty, return the top element
if (!isEmpty())
return head.data;
else {
Console.WriteLine("\nStack is empty");
return int.MinValue;
}
}
}
// Driver program to test the stack implementation
class GfG {
static void Main(string[] args)
{
// Creating a stack
Stack st = new Stack();
// Push elements onto the stack
st.push(11);
st.push(22);
st.push(33);
st.push(44);
// Print top element of the stack
Console.WriteLine("Top element is " + st.peek());
// removing two elemements from the top
Console.WriteLine("Removing two elements...");
st.pop();
st.pop();
// Print top element of the stack
Console.WriteLine("Top element is " + st.peek());
}
}
JavaScript
// Javascript program to implement a stack using singly
// linked list
// Class representing a node in the linked list
class Node {
constructor(new_data) {
this.data = new_data;
this.next = null;
}
}
// Class to implement stack using a singly linked list
class Stack {
// Constructor to initialize the stack
constructor() { this.head = null; }
// Function to check if the stack is empty
isEmpty() {
// If head is null, the stack is empty
return this.head === null;
}
// Function to push an element onto the stack
push(new_data) {
// Create a new node with given data
const new_node = new Node(new_data);
// Check if memory allocation for the new node
// failed
if (!new_node) {
console.log("\nStack Overflow");
return;
}
// Link the new node to the current top node
new_node.next = this.head;
// Update the top to the new node
this.head = new_node;
}
// Function to remove the top element from the stack
pop() {
// Check for stack underflow
if (this.isEmpty()) {
console.log("\nStack Underflow");
}
else {
// Assign the current top to a temporary
// variable
let temp = this.head;
// Update the top to the next node
this.head = this.head.next;
// Deallocate the memory of the old top node
temp = null;
}
}
// Function to return the top element of the stack
peek() {
// If stack is not empty, return the top element
if (!this.isEmpty())
return this.head.data;
else {
console.log("\nStack is empty");
return Number.MIN_VALUE;
}
}
}
// Driver program to test the stack implementation
const st = new Stack();
// Push elements onto the stack
st.push(11);
st.push(22);
st.push(33);
st.push(44);
// Print top element of the stack
console.log("Top element is " + st.peek());
// removing two elemements from the top
console.log("Removing two elements...");
st.pop();
st.pop();
// Print top element of the stack
console.log("Top element is " + st.peek());
OutputTop element is 44
Top element is 22
Time Complexity: O(1), for all push(), pop(), and peek(), as we are not performing any kind of traversal over the list. We perform all the operations through the current pointer only.
Auxiliary Space: O(N), where N is the size of the stack
In this implementation, we define a Node class that represents a node in the linked list, and a Stack class that uses this node class to implement the stack. The head attribute of the Stack class points to the top of the stack (i.e., the first node in the linked list).
To push an item onto the stack, we create a new node with the given item and set its next pointer to the current head of the stack. We then set the head of the stack to the new node, effectively making it the new top of the stack.
To pop an item from the stack, we simply remove the first node from the linked list by setting the head of the stack to the next node in the list (i.e., the node pointed to by the next pointer of the current head). We return the data stored in the original head node, which is the item that was removed from the top of the stack.
Benefits of implementing a stack using a singly linked list include:
Dynamic memory allocation: The size of the stack can be increased or decreased dynamically by adding or removing nodes from the linked list, without the need to allocate a fixed amount of memory for the stack upfront.
Efficient memory usage: Since nodes in a singly linked list only have a next pointer and not a prev pointer, they use less memory than nodes in a doubly linked list.
Easy implementation: Implementing a stack using a singly linked list is straightforward and can be done using just a few lines of code.
Versatile: Singly linked lists can be used to implement other data structures such as queues, linked lists, and trees.
In summary, implementing a stack using a singly linked list is a simple and efficient way to create a dynamic stack data structure in Python.
Real time examples of stack:
Stacks are used in various real-world scenarios where a last-in, first-out (LIFO) data structure is required. Here are some examples of real-time applications of stacks:
Function call stack: When a function is called in a program, the return address and all the function parameters are pushed onto the function call stack. The stack allows the function to execute and return to the caller function in the reverse order in which they were called.
Undo/Redo operations: In many applications, such as text editors, image editors, or web browsers, the undo and redo functionalities are implemented using a stack. Every time an action is performed, it is pushed onto the stack. When the user wants to undo the last action, the top element of the stack is popped and the action is reversed.
Browser history: Web browsers use stacks to keep track of the pages visited by the user. Every time a new page is visited, its URL is pushed onto the stack. When the user clicks the “Back” button, the last visited URL is popped from the stack and the user is directed to the previous page.
Expression evaluation: Stacks are used in compilers and interpreters to evaluate expressions. When an expression is parsed, it is converted into postfix notation and pushed onto a stack. The postfix expression is then evaluated using the stack.
Call stack in recursion: When a recursive function is called, its call is pushed onto the stack. The function executes and calls itself, and each subsequent call is pushed onto the stack. When the recursion ends, the stack is popped, and the program returns to the previous function call.
In summary, stacks are widely used in many applications where LIFO functionality is required, such as function calls, undo/redo operations, browser history, expression evaluation, and recursive function calls.
Similar Reads
Stack Data Structure
A Stack is a linear data structure that follows a particular order in which the operations are performed. The order may be LIFO(Last In First Out) or FILO(First In Last Out). LIFO implies that the element that is inserted last, comes out first and FILO implies that the element that is inserted first
3 min read
What is Stack Data Structure? A Complete Tutorial
Stack is a linear data structure that follows LIFO (Last In First Out) Principle, the last element inserted is the first to be popped out. It means both insertion and deletion operations happen at one end only. LIFO(Last In First Out) PrincipleHere are some real world examples of LIFO Consider a sta
4 min read
Applications, Advantages and Disadvantages of Stack
A stack is a linear data structure in which the insertion of a new element and removal of an existing element takes place at the same end represented as the top of the stack. Applications of Stacks:Function calls: Stacks are used to keep track of the return addresses of function calls, allowing the
2 min read
Implement a stack using singly linked list
To implement a stack using the singly linked list concept, all the singly linked list operations should be performed based on Stack operations LIFO(last in first out) and with the help of that knowledge, we are going to implement a stack using a singly linked list. So we need to follow a simple rul
15+ min read
Introduction to Monotonic Stack - Data Structure and Algorithm Tutorials
A monotonic stack is a special data structure used in algorithmic problem-solving. Monotonic Stack maintaining elements in either increasing or decreasing order. It is commonly used to efficiently solve problems such as finding the next greater or smaller element in an array etc. Table of Content Wh
12 min read
Difference Between Stack and Queue Data Structures
In computer science, data structures are fundamental concepts that are crucial for organizing and storing data efficiently. Among the various data structures, stacks and queues are two of the most basic yet essential structures used in programming and algorithm design. Despite their simplicity, they
4 min read
Stack implementation in different language
Stack in C++ STL
Stacks are a type of container adaptors with LIFO(Last In First Out) type of working, where a new element is added at one end (top) and an element is removed from that end only. Stack uses an encapsulated object of either vector or deque (by default) or list (sequential container class) as its under
4 min read
Stack Class in Java
Java Collection framework provides a Stack class that models and implements a Stack data structure. The class is based on the basic principle of LIFO(last-in-first-out). In addition to the basic push and pop operations, the class provides three more functions of empty, search, and peek. The Stack cl
11 min read
Stack in Python
A stack is a linear data structure that stores items in a Last-In/First-Out (LIFO) or First-In/Last-Out (FILO) manner. In stack, a new element is added at one end and an element is removed from that end only. The insert and delete operations are often called push and pop. The functions associated wi
8 min read
C# Stack with Examples
A Stack represents a last-in, first-out collection of objects. It is used when you need last-in, first-out access to items. It is both a generic and non-generic type of collection. The generic stack is defined in System.Collections.Generic namespace whereas non-generic stack is defined under System.
6 min read
Implementation of Stack in JavaScript
Implementation of a stack in JavaScript involves creating a data structure that follows the Last-In-First-Out (LIFO) principle, where elements are added and removed from the same end. We use stacks to manage function calls, undo functionality, and parse algorithms efficiently in JavaScript applicati
4 min read
Stack in Scala
A stack is a data structure that follows the last-in, first-out(LIFO) principle. We can add or remove element only from one end called top. Scala has both mutable and immutable versions of a stack. Syntax : import scala.collection.mutable.Stack var s = Stack[type]() // OR var s = Stack(val1, val2, v
3 min read
Some questions related to Stack implementation
Design and Implement Special Stack Data Structure | Added Space Optimized Version
Question: Design a Data Structure SpecialStack that supports all the stack operations like push(), pop(), isEmpty(), isFull() and an additional operation getMin() which should return minimum element from the SpecialStack. All these operations of SpecialStack must be O(1). To implement SpecialStack,
15+ min read
Implement two Stacks in an Array
Create a data structure twoStacks that represent two stacks. Implementation of twoStacks should use only one array, i.e., both stacks should use the same array for storing elements. Following functions must be supported by twoStacks. push1(int x) --> pushes x to first stack push2(int x) --> pu
15+ min read
Implement Stack using Queues
Given a Queue data structure that supports standard operations like enqueue() and dequeue(). The task is to implement a Stack data structure using Queue. A Stack can be implemented using two queues. Let Stack to be implemented be 's' and queues used to implement are 'q1' and 'q2'. Stack 's' can be
14 min read
How to efficiently implement k stacks in a single array?
We have discussed space-efficient implementation of 2 stacks in a single array. In this post, a general solution for k stacks is discussed. Following is the detailed problem statement. Create a data structure kStacks that represents k stacks. Implementation of kStacks should use only one array, i.e.
15+ min read
Design a stack that supports getMin() in O(1) time and O(1) extra space
Design a Data Structure SpecialStack that supports all the stack operations like push(), pop(), isEmpty(), isFull() and an additional operation getMin() which should return minimum element from the SpecialStack. All these operations of SpecialStack must have a time and space complexity of O(1). Note
15+ min read
Implement a stack using single queue
We are given queue data structure, the task is to implement stack using only given queue data structure.We have discussed a solution that uses two queues. In this article, a new solution is discussed that uses only one queue. This solution assumes that we can find size of queue at any point. The ide
6 min read
How to implement stack using priority queue or heap?
How to Implement stack using a priority queue(using min heap)? Asked In: Microsoft, Adobe. Solution: In the priority queue, we assign priority to the elements that are being pushed. A stack requires elements to be processed in the Last in First Out manner. The idea is to associate a count that dete
6 min read
Create a customized data structure which evaluates functions in O(1)
Create a customized data structure such that it has functions :- GetLastElement(); RemoveLastElement(); AddElement() GetMin() All the functions should be of O(1) Question Source : amazon interview questions Approach : create a custom stack of type structure with two elements, (element, min_till_now)
7 min read
Implement Stack and Queue using Deque
Deque also known as double ended queue, as name suggests is a special kind of queue in which insertions and deletions can be done at the last as well as at the beginning. A link-list representation of deque is such that each node points to the next node as well as the previous node. So that insertio
15 min read
Easy problems on Stack
Convert Infix expression to Postfix expression
Write a program to convert an Infix expression to Postfix form. Infix expression: The expression of the form "a operator b" (a + b) i.e., when an operator is in-between every pair of operands.Postfix expression: The expression of the form "a b operator" (ab+) i.e., When every pair of operands is fol
11 min read
Prefix to Infix Conversion
Infix : An expression is called the Infix expression if the operator appears in between the operands in the expression. Simply of the form (operand1 operator operand2). Example : (A+B) * (C-D) Prefix : An expression is called the prefix expression if the operator appears in the expression before the
6 min read
Prefix to Postfix Conversion
Given a Prefix expression, convert it into a Postfix expression. Conversion of Prefix expression directly to Postfix without going through the process of converting them first to Infix and then to Postfix is much better in terms of computation and better understanding the expression (Computers evalu
6 min read
Postfix to Prefix Conversion
Postfix: An expression is called the postfix expression if the operator appears in the expression after the operands. Simply of the form (operand1 operand2 operator). Example : AB+CD-* (Infix : (A+B) * (C-D) ) Prefix : An expression is called the prefix expression if the operator appears in the expr
7 min read
Postfix to Infix
Infix expression: The expression of the form a op b. When an operator is in-between every pair of operands. Postfix expression: The expression of the form a b op. When an operator is followed for every pair of operands. Postfix notation, also known as reverse Polish notation, is a syntax for mathema
7 min read
Convert Infix To Prefix Notation
Given an infix expression, the task is to convert it to a prefix expression. Infix Expression: The expression of type a 'operator' b (a+b, where + is an operator) i.e., when the operator is between two operands. Prefix Expression: The expression of type 'operator' a b (+ab where + is an operator) i.
12 min read
Valid Parentheses in an Expression
Given a string s representing an expression containing various types of brackets: {}, (), and [], the task is to determine whether the brackets in the expression are balanced or not. A balanced expression is one where every opening bracket has a corresponding closing bracket in the correct order. Ex
8 min read
Arithmetic Expression Evaluation
The stack organization is very effective in evaluating arithmetic expressions. Expressions are usually represented in what is known as Infix notation, in which each operator is written between two operands (i.e., A + B). With this notation, we must distinguish between ( A + B )*C and A + ( B * C ) b
2 min read
Evaluation of Postfix Expression
Given a postfix expression, the task is to evaluate the postfix expression. A Postfix expression is of the form "a b operator" (ab+) i.e., a pair of operands is followed by an operator. Examples: Input: str = "2 3 1 * + 9 -"Output: -4Explanation: If the expression is converted into an infix expressi
15+ min read
How to Reverse a Stack using Recursion
Write a program to reverse a stack using recursion, without using any loop. Example: Input: elements present in stack from top to bottom 1 2 3 4 Output: 4 3 2 1 Input: elements present in stack from top to bottom 1 2 3Output: 3 2 1 Recommended PracticeReverse a StackTry It!Reverse a stack using Recu
11 min read
Reverse individual words
Given string str, we need to print the reverse of individual words. Examples: Input : Hello World Output : olleH dlroW Input : Geeks for Geeks Output : skeeG rof skeeG Method 1 (Simple): Generate all words separated by space. One by one reverse word and print them separated by space. Method 2 (Space
15+ min read
How to Reverse a String using Stack
Given a string, reverse it using stack. Example: Input: str = "GeeksQuiz"Output: ziuQskeeG Input: str = "abc"Output: cba Recommended PracticeReverse a string using StackTry It! Approach: The idea is to create an empty stack and push all the characters from the string into it. Then pop each character
12 min read
Reversing a Queue
Give an algorithm for reversing a queue Q. Only the following standard operations are allowed on queue. enqueue(x): Add an item x to the rear of the queue.dequeue(): Remove an item from the front of the queue.empty(): Checks if a queue is empty or not. The task is to reverse the queue. Examples: Inp
8 min read
Intermediate problems on Stack
How to create mergeable stack?
Design a stack with the following operations. push(Stack s, x): Adds an item x to stack s pop(Stack s): Removes the top item from stack s merge(Stack s1, Stack s2): Merge contents of s2 into s1. Time Complexity of all above operations should be O(1). If we use array implementation of the stack, then
8 min read
The Stock Span Problem
The stock span problem is a financial problem where we have a series of daily price quotes for a stock denoted by an array arr[] and the task is to calculate the span of the stock's price for all days. The span arr[i] of the stock's price on a given day i is defined as the maximum number of consecut
10 min read
Next Greater Element (NGE) for every element in given Array
Given an array arr[] of integers, the task is to find the Next Greater Element for each element of the array in order of their appearance in the array. Note: The Next Greater Element for an element x is the first greater element on the right side of x in the array. Elements for which no greater elem
10 min read
Next Greater Frequency Element
Given an array, for each element find the value of the nearest element to the right which is having a frequency greater than that of the current element. If there does not exist an answer for a position, then make the value '-1'. Examples: Input : a[] = [1, 1, 2, 3, 4, 2, 1] Output : [-1, -1, 1, 2,
15+ min read
Maximum product of indexes of next greater on left and right
Given an array a[1..N]. For each element at position i (1 <= i <= N). Where L(i) is defined as closest index j such that j < i and a[j] > a[i]. If no such j exists then L(i) = 0.R(i) is defined as closest index k such that k > i and a[k] > a[i]. If no such k exists then R(i) = 0. L
15+ min read
Iterative Tower of Hanoi
The Tower of Hanoi is a mathematical puzzle. It consists of three poles and a number of disks of different sizes which can slide onto any pole. The puzzle starts with the disk in a neat stack in ascending order of size in one pole, the smallest at the top thus making a conical shape. The objective o
15+ min read
Sort a stack using a temporary stack
Given a stack of integers, sort it in ascending order using another temporary stack. Examples: Input : [34, 3, 31, 98, 92, 23]Output : [3, 23, 31, 34, 92, 98]Input : [3, 5, 1, 4, 2, 8]Output : [1, 2, 3, 4, 5, 8] Algorithm: Create a temporary stack say tmpStack.While input stack is NOT empty do this:
6 min read
Reverse a stack without using extra space in O(n)
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 Recu
6 min read
Delete middle element of a stack
Given a stack with push(), pop(), and empty() operations, The task is to delete the middle element of it without using any additional data structure. Input : Stack[] = [1, 2, 3, 4, 5]Output : Stack[] = [1, 2, 4, 5] Input : Stack[] = [1, 2, 3, 4, 5, 6]Output : Stack[] = [1, 2, 4, 5, 6] Recommended Pr
13 min read
Check if a queue can be sorted into another queue using a stack
Given a Queue consisting of first n natural numbers (in random order). The task is to check whether the given Queue elements can be arranged in increasing order in another Queue using a stack. The operation allowed are: Push and pop elements from the stack Pop (Or Dequeue) from the given Queue. Push
9 min read
Check if an array is stack sortable
Given an array of N distinct elements where elements are between 1 and N both inclusive, check if it is stack-sortable or not. An array A[] is said to be stack sortable if it can be stored in another array B[], using a temporary stack S. The operations that are allowed on array are: Remove the start
10 min read
Largest Rectangular Area in a Histogram
Find the largest rectangular area possible in a given histogram where the largest rectangle can be made of a number of contiguous bars whose heights are given in an array. For simplicity, assume that all bars have the same width and the width is 1 unit. Example: Input: hist = {60, 20, 50, 40, 10, 50
15+ min read
Maximum of minimums of every window size in a given array
Given an integer array arr[] of size n, find the maximum of the minimums for every window size in the given array. The window size varies from 1 to n. Example: Input : arr[] = {10, 20, 30}Output: {30, 20, 10}Explanation: First element in output indicates maximum of minimums of all windows of size 1.
14 min read
Find index of closing bracket for a given opening bracket in an expression
Given a string with brackets. If the start index of the open bracket is given, find the index of the closing bracket. Examples: Input : string = [ABC[23]][89] index = 0 Output : 8 The opening bracket at index 0 corresponds to closing bracket at index 8.Recommended PracticeClosing bracket indexTry It
7 min read
Find maximum difference between nearest left and right smaller elements
Given an array of integers, the task is to find the maximum absolute difference between the nearest left and the right smaller element of every element in the array. Note: If there is no smaller element on right side or left side of any element then we take zero as the smaller element. For example f
12 min read
Delete consecutive same words in a sequence
Given a sequence of n strings, the task is to check if any two similar words come together and then destroy each other then print the number of words left in the sequence after this pairwise destruction. Examples: Input : ab aa aa bcd abOutput : 3As aa, aa destroys each other so, ab bcd ab is the ne
9 min read
Check mirror in n-ary tree
Given two n-ary trees, the task is to check if they are the mirror of each other or not. Print "Yes" if they are the mirror of each other else "No". Examples: Input : Node = 3, Edges = 2 Edge 1 of first N-ary: 1 2 Edge 2 of first N-ary: 1 3 Edge 1 of second N-ary: 1 3 Edge 2 of second N-ary: 1 2 Out
13 min read
Reverse a number using stack
Given a number , write a program to reverse this number using stack. Examples: Input : 365Output : 563Input : 6899Output : 9986We have already discussed the simple method to reverse a number in this post. In this post we will discuss about how to reverse a number using stack.The idea to do this is t
5 min read
Reversing the first K elements of a Queue
Given an integer k and a queue of integers, The task is to reverse the order of the first k elements of the queue, leaving the other elements in the same relative order. Only following standard operations are allowed on queue. enqueue(x) : Add an item x to rear of queuedequeue() : Remove an item fro
15 min read
Hard problems on Stack
The Celebrity Problem
Given a square matrix mat[][] of size n x n, such that mat[i][j] = 1 means ith person knows jth person, the task is to find the celebrity. A celebrity is a person who is known to all but does not know anyone. Return the index of the celebrity, if there is no celebrity return -1. Note: Follow 0 based
15+ min read
Print next greater number of Q queries
Given an array of n elements and q queries, for each query that has index i, find the next greater element and print its value. If there is no such greater element to its right then print -1. Examples: Input : arr[] = {3, 4, 2, 7, 5, 8, 10, 6} query indexes = {3, 6, 1}Output: 8 -1 7 Explanation : Fo
15+ min read
Iterative Postorder Traversal | Set 2 (Using One Stack)
We have discussed a simple iterative postorder traversal using two stacks in the previous post. In this post, an approach with only one stack is discussed. The idea is to move down to leftmost node using left pointer. While moving down, push root and root's right child to stack. Once we reach leftmo
15+ min read
Print ancestors of a given binary tree node without recursion
Given a Binary Tree and a key, write a function that prints all the ancestors of the key in the given binary tree.For example, consider the following Binary Tree 1 / \ 2 3 / \ / \ 4 5 6 7 / \ / 8 9 10 Following are different input keys and their ancestors in the above tree Input Key List of Ancestor
15 min read
Longest Valid Parentheses Substring
Given a string str consisting of opening and closing parenthesis '(' and ')'. Find the length of the longest valid parenthesis substring. Examples: Input: ((()Output : 2Explanation : Longest Valid Parentheses Substring is (). Input: )()())Output : 4Explanation: Longest Valid Parentheses Substring is
15+ min read
Expression contains redundant bracket or not
Given a string of balanced expressions, find if it contains a redundant parenthesis or not. A set of parenthesis is redundant if the same sub-expression is surrounded by unnecessary or multiple brackets. Print 'Yes' if redundant, else 'No'. Note: Expression may contain '+', '*', '-' and '/' operator
7 min read
Find if an expression has duplicate parenthesis or not
Given a balanced expression, find if it contains duplicate parenthesis or not. A set of parenthesis are duplicate if the same subexpression is surrounded by multiple parenthesis. Examples: Below expressions have duplicate parenthesis - ((a+b)+((c+d))) The subexpression "c+d" is surrounded by two pai
7 min read
Find next Smaller of next Greater in an array
Given array of integer, find the next smaller of next greater element of every element in array. Note : Elements for which no greater element exists or no smaller of greater element exist, print -1. Examples: Input : arr[] = {5, 1, 9, 2, 5, 1, 7} Output: 2 2 -1 1 -1 -1 -1 Explanation : Next Greater
14 min read
Iterative method to find ancestors of a given binary tree
Given a binary tree, print all the ancestors of a particular key existing in the tree without using recursion.Here we will be discussing the implementation for the above problem. Examples: Input : 1 / \ 2 7 / \ / \ 3 5 8 9 / \ / 4 6 10 Key = 6 Output : 5 2 1 Ancestors of 6 are 5, 2 and 1. The idea i
12 min read
Stack Permutations (Check if an array is stack permutation of other)
A stack permutation is a permutation of objects in the given input queue which is done by transferring elements from the input queue to the output queue with the help of a stack and the built-in push and pop functions. The rules are: Only dequeue from the input queue.Use inbuilt push, and pop functi
15+ min read
Remove brackets from an algebraic string containing + and - operators
Simplify a given algebraic string of characters, '+', '-' operators and parentheses. Output the simplified string without parentheses. Examples: Input : "(a-(b+c)+d)" Output : "a-b-c+d" Input : "a-(b-c-(d+e))-f" Output : "a-b+c+d+e-f" The idea is to check operators just before starting of bracket, i
8 min read
Range Queries for Longest Correct Bracket Subsequence Set | 2
Given a bracket sequence or in other words a string S of length n, consisting of characters ‘(‘ and ‘)’. Find the length of the maximum correct bracket subsequence of sequence for a given query range. Note: A correct bracket sequence is the one that has matched bracket pairs or which contains anothe
8 min read