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)
- implement the functions on this custom data type
Implementation:
C++
// program to demonstrate customized data structure // which supports functions in O(1) #include <iostream> #include <vector> using namespace std;
const int MAXX = 1000;
// class stack class stack {
int minn;
int size;
public :
stack()
{
minn = 99999;
size = -1;
}
vector<pair< int , int > > arr;
int GetLastElement();
int RemoveLastElement();
int AddElement( int element);
int GetMin();
}; // utility function for adding a new element int stack::AddElement( int element)
{ if (size > MAXX) {
cout << "stack overflow, max size reached!\n" ;
return 0;
}
if (element < minn)
minn = element;
arr.push_back(make_pair(element, minn));
size++;
return 1;
} // utility function for returning last element of stack int stack::GetLastElement()
{ if (size == -1) {
cout << "No elements in stack\n" ;
return 0;
}
return arr[size].first;
} // utility function for removing last element successfully; int stack::RemoveLastElement()
{ if (size == -1) {
cout << "stack empty!!!\n" ;
return 0;
}
// updating minimum element
if (size > 0 && arr[size - 1].second > arr[size].second) {
minn = arr[size - 1].second;
}
arr.pop_back();
size -= 1;
return 1;
} // utility function for returning min element till now; int stack::GetMin()
{ if (size == -1) {
cout << "stack empty!!\n" ;
return 0;
}
return arr[size].second;
} // Driver code int main()
{ stack s;
int success = s.AddElement(5);
if (success == 1)
cout << "5 inserted successfully\n" ;
success = s.AddElement(7);
if (success == 1)
cout << "7 inserted successfully\n" ;
success = s.AddElement(3);
if (success == 1)
cout << "3 inserted successfully\n" ;
int min1 = s.GetMin();
cout << "min element :: " << min1 << endl;
success = s.RemoveLastElement();
if (success == 1)
cout << "removed successfully\n" ;
success = s.AddElement(2);
if (success == 1)
cout << "2 inserted successfully\n" ;
success = s.AddElement(9);
if (success == 1)
cout << "9 inserted successfully\n" ;
int last = s.GetLastElement();
cout << "Last element :: " << last << endl;
success = s.AddElement(0);
if (success == 1)
cout << "0 inserted successfully\n" ;
min1 = s.GetMin();
cout << "min element :: " << min1 << endl;
success = s.RemoveLastElement();
if (success == 1)
cout << "removed successfully\n" ;
success = s.AddElement(11);
if (success == 1)
cout << "11 inserted successfully\n" ;
min1 = s.GetMin();
cout << "min element :: " << min1 << endl;
return 0;
} |
Java
// program to demonstrate customized data structure // which supports functions in O(1) import java.util.ArrayList;
public class Gfg
{ // class Pair
static class Pair{
int element;
int minElement;
public Pair( int element, int minElement) {
this .element = element;
this .minElement = minElement;
}
}
int min;
ArrayList<Pair> stack = new ArrayList<>();
public Gfg() {
this .min = Integer.MAX_VALUE;
}
// utility function for adding a new element
void addElement( int x)
{
if (stack.size() == 0 || x < min)
{
min=x;
}
Pair pair = new Pair(x,min);
stack.add(pair);
System.out.println(x + " inserted successfully" );
}
// utility function for returning last element of stack
int getLastElement()
{
if (stack.size() == 0 )
{
System.out.println( "UnderFlow Error" );
return - 1 ;
}
else
{
return stack.get(stack.size() - 1 ).element;
}
}
// utility function for removing last element successfully;
void removeLastElement()
{
if (stack.size() == 0 )
{
System.out.println( "UnderFlow Error" );
}
else if (stack.size() > 1 )
{
min=stack.get(stack.size() - 2 ).minElement;
}
else
{
min=Integer.MAX_VALUE;
}
stack.remove(stack.size() - 1 );
System.out.println( "removed successfully" );
}
// utility function for returning min element till now;
int getMin()
{
if (stack.size() == 0 )
{
System.out.println( "UnderFlow Error" );
return - 1 ;
}
return stack.get(stack.size() - 1 ).minElement;
}
// Driver Code
public static void main(String[] args) {
Gfg newStack = new Gfg();
newStack.addElement( 5 );
newStack.addElement( 7 );
newStack.addElement( 3 );
System.out.println( "min element :: " +newStack.getMin());
newStack.removeLastElement();
newStack.addElement( 2 );
newStack.addElement( 9 );
System.out.println( "last element :: " +newStack.getLastElement());
newStack.addElement( 0 );
System.out.println( "min element :: " +newStack.getMin());
newStack.removeLastElement();
newStack.addElement( 11 );
System.out.println( "min element :: " +newStack.getMin());
}
} // This code is contributed by AkashYadav4. |
Python3
# Program to demonstrate customized data structure # which supports functions in O(1) import sys
stack = []
Min = sys.maxsize
# Utility function for adding a new element def addElement(x):
global Min , stack
if ( len (stack) = = 0 or x < Min ):
Min = x
pair = [x, Min ]
stack.append(pair)
print (x, "inserted successfully" )
# Utility function for returning last # element of stack def getLastElement():
global Min , stack
if ( len (stack) = = 0 ):
print ( "UnderFlow Error" )
return - 1
else :
return stack[ - 1 ][ 0 ]
# Utility function for removing last # element successfully; def removeLastElement():
global Min , stack
if ( len (stack) = = 0 ):
print ( "UnderFlow Error" )
elif ( len (stack) > 1 ):
Min = stack[ - 2 ][ 1 ]
else :
Min = sys.maxsize
stack.pop()
print ( "removed successfully" )
# Utility function for returning min # element till now; def getMin():
global Min , stack
if ( len (stack) = = 0 ):
print ( "UnderFlow Error" )
return - 1
return stack[ - 1 ][ 1 ]
# Driver code addElement( 5 )
addElement( 7 )
addElement( 3 )
print ( "min element ::" , getMin())
removeLastElement() addElement( 2 )
addElement( 9 )
print ( "Last element ::" , getLastElement())
addElement( 0 )
print ( "min element ::" , getMin())
removeLastElement() addElement( 11 )
print ( "min element ::" , getMin())
# This code is contributed by mukesh07 |
C#
// program to demonstrate customized data structure // which supports functions in O(1) using System;
using System.Collections.Generic;
class GFG {
static List<Tuple< int , int >> stack = new List<Tuple< int , int >>();
static int min = Int32.MaxValue;
// utility function for adding a new element
static void addElement( int x)
{
if (stack.Count == 0 || x < min)
{
min=x;
}
Tuple< int , int > pair = new Tuple< int , int >(x,min);
stack.Add(pair);
Console.WriteLine(x + " inserted successfully" );
}
// utility function for returning last element of stack
static int getLastElement()
{
if (stack.Count == 0)
{
Console.WriteLine( "UnderFlow Error" );
return -1;
}
else
{
return stack[stack.Count - 1].Item1;
}
}
// utility function for removing last element successfully;
static void removeLastElement()
{
if (stack.Count == 0)
{
Console.WriteLine( "UnderFlow Error" );
}
else if (stack.Count > 1)
{
min=stack[stack.Count - 2].Item2;
}
else
{
min=Int32.MaxValue;
}
stack.RemoveAt(stack.Count - 1);
Console.WriteLine( "removed successfully" );
}
// utility function for returning min element till now;
static int getMin()
{
if (stack.Count == 0)
{
Console.WriteLine( "UnderFlow Error" );
return -1;
}
return stack[stack.Count - 1].Item2;
}
static void Main() {
addElement(5);
addElement(7);
addElement(3);
Console.WriteLine( "min element :: " +getMin());
removeLastElement();
addElement(2);
addElement(9);
Console.WriteLine( "Last element :: " +getLastElement());
addElement(0);
Console.WriteLine( "min element :: " +getMin());
removeLastElement();
addElement(11);
Console.WriteLine( "min element :: " +getMin());
}
} // This code is contributed by divyeshrabadiya07. |
Javascript
<script> // program to demonstrate customized data structure
// which supports functions in O(1)
let min;
let stack = [];
min = Number.MAX_VALUE
// utility function for adding a new element
function addElement(x)
{
if (stack.length == 0 || x < min)
{
min=x;
}
let pair = [x,min];
stack.push(pair);
document.write(x + " inserted successfully" + "</br>" );
}
// utility function for returning last element of stack
function getLastElement()
{
if (stack.length == 0)
{
document.write( "UnderFlow Error" + "</br>" );
return -1;
}
else
{
return stack[stack.length - 1][0];
}
}
// utility function for removing last element successfully;
function removeLastElement()
{
if (stack.length == 0)
{
document.write( "UnderFlow Error" + "</br>" );
}
else if (stack.length > 1)
{
min=stack[stack.length - 2][1];
}
else
{
min=Number.MAX_VALUE;
}
stack.pop();
document.write( "removed successfully" + "</br>" );
}
// utility function for returning min element till now;
function getMin()
{
if (stack.length == 0)
{
document.write( "UnderFlow Error" + "</br>" );
return -1;
}
return stack[stack.length - 1][1];
}
addElement(5);
addElement(7);
addElement(3);
document.write( "min element :: " +getMin() + "</br>" );
removeLastElement();
addElement(2);
addElement(9);
document.write( "Last element :: " +getLastElement() + "</br>" );
addElement(0);
document.write( "min element :: " +getMin() + "</br>" );
removeLastElement();
addElement(11);
document.write( "min element :: " +getMin() + "</br>" );
// This code is contributed by rameshtravel07.
</script> |
Output
5 inserted successfully 7 inserted successfully 3 inserted successfully min element :: 3 removed successfully 2 inserted successfully 9 inserted successfully Last element :: 9 0 inserted successfully min element :: 0 removed successfully 11 inserted successfully min element :: 2
Time complexity: Each function runs in O(1)
Auxiliary space: O(n) for stack