Question : Implement a stack which finds the minimum of elements in the stack. All the three functions push(), pop() and findmin() must have time complexity of O(1)
This is one of the common questions asked in interviews.
The problem is finding minimum requires you to traverse through the stack, which is not possible without popping elements. So you can pop elements, find minimum and then push the elements back.
But the requirement says that findmin() function must have a constant complexity - O(1).
You can achieve this with the help of one more stack, to store minimum values.
Let us call this minstack. This is how the operations will work
So this way we can have all three functions with O(1) time complexity. Here is our codeThis is one of the common questions asked in interviews.
The problem is finding minimum requires you to traverse through the stack, which is not possible without popping elements. So you can pop elements, find minimum and then push the elements back.
But the requirement says that findmin() function must have a constant complexity - O(1).
You can achieve this with the help of one more stack, to store minimum values.
Let us call this minstack. This is how the operations will work
push -
- push a value to stack
- compare the value with top of minstack
- if value is smaller than minstack top element push it to minstack
- if not push minstack top element again to minstack
pop
- pop a value from stack
- pop a value from minstack
findmin
- get the value from minstack without popping it (peek)
#include<stdio.h> #include<stdlib.h> #define ERROR -1000 struct node { int value; struct node *next; }; typedef struct node * NODEPTR; NODEPTR create_node(int value) { NODEPTR temp = (NODEPTR) malloc(sizeof(struct node)); temp->next = NULL; temp->value= value; return temp; } NODEPTR push(NODEPTR top,int val) { NODEPTR newnode = create_node(val); newnode->next = top; top = newnode; return top; } int isempty(NODEPTR top) { return top==NULL; } int pop(NODEPTR *topPtr) { if(isempty(*topPtr)) return ERROR; int num = (*topPtr)->value; NODEPTR temp = *topPtr; *topPtr = (*topPtr)->next; free(temp); return num; } int peek(NODEPTR nd) { return nd->value; } void push1(NODEPTR*topptr,NODEPTR* mintopptr,int val) { int minval =val; if(*mintopptr!=NULL) { int temp = peek(*mintopptr); if (temp<minval) minval = temp; } *topptr = push(*topptr,val); *mintopptr = push(*mintopptr,minval); } int pop1(NODEPTR* topptr,NODEPTR *mintopptr) { if(!isempty(*topptr)) { pop(mintopptr); return pop(topptr); }else return -1; } int findmin(NODEPTR mintop) { if(mintop==NULL) return -1; return mintop->value; } int main() { NODEPTR top = NULL;//stack NODEPTR nd; NODEPTR mintop=NULL;//minstack while(1) { int option,value; printf("Enter 1- push 2- pop 3 - exit 4- find minimum"); scanf("%d",&option); if(option==3) break; switch(option) { case 1: printf("new value to push="); scanf("%d",&value); push1(&top,&mintop,value); break; case 2: value = pop1(&top,&mintop); if(value==ERROR) printf("Stack empty\n"); else printf("Value popped is %d\n",value); break; case 4: value=findmin(mintop); if(value==-1) printf("Stack empty\n"); else printf("Minimum of stack is %d\n",value); break; } } }
Notes
- We are implementing the stack using a linked list
- push1() function is used for pushing the value to both the stack and minstack. pop1 is used for popping values.
Comments
Post a Comment