Stack Data Structure
Stack is simplest and very useful commonly used data structure. There is based on First In Last Out(FILO) or , In other word Last In First Out(LIFO). That means most recently added element is removing of first. There are main two operation of this data structure. Inserting element that is called push operation and removing element of Top of stack that is called pop operation.

Stack are restricted to insert and delete element in single end. So active state of stack is top section and inactive is bottom section. because push() and pop() operation are will be performed in top section of stack.
Stack Implementation
In this section implemented of stack using array and linked list data structure. Implemented of stack by using of array there are limitation of size. View program to implement stack using array.
//implement stack using array
#include<stdio.h>
//function prototype
void push(int);
void display();
void pop();
int isEmpty();
int isFull();
//set size of stack
#define SIZE 10
int element[SIZE],top=-1;
//insert Stack element
void push(int value){
if(isFull()){
printf("Stack Is Full\n");
}else{
element[++top]=value;
printf("\nPush Stack element %d", value);
display();
}
}
//pop Stack element
void pop(){
if(isEmpty()){
printf("Empty Stack\n");
}else{
printf("\nPop Stack element %d", element[top]);
top--;
display();
}
}
//display element of Stack
void display(){
if(isEmpty()){
printf("\nEmpty Stack\n");
}else{
printf("\n Stack Element :");
int index=0;
for(index;index<=top;index++){
printf(" %d",element[index]);
}
}
}
int isFull(){
if(top+1==SIZE){
return 1;
}else{
return 0;
}
}
int isEmpty(){
if(top==-1){
return 1;
}else{
return 0;
}
}
int main(){
//insert elements
push(5);
push(4);
push(3);
push(2);
push(1);
//delete elements
pop();
pop();
pop();
pop();
pop();
}
Output
Push Stack element 5
Stack Element : 5
Push Stack element 4
Stack Element : 5 4
Push Stack element 3
Stack Element : 5 4 3
Push Stack element 2
Stack Element : 5 4 3 2
Push Stack element 1
Stack Element : 5 4 3 2 1
Pop Stack element 1
Stack Element : 5 4 3 2
Pop Stack element 2
Stack Element : 5 4 3
Pop Stack element 3
Stack Element : 5 4
Pop Stack element 4
Stack Element : 5
Pop Stack element 5
Empty Stack
//C++ Stack implemation By using Array
#include<iostream>
using namespace std;
//Create a Stack class
class Stack{
public:
int top,
limit,
*element;
public:
//member function of class
Stack(int);
void push(int);
void pop();
void display();
int isEmpty();
int isFull();
};
//constructor of class
Stack::Stack(int size){
top=-1;
limit=size;
//create stack of given size
element=new int[size];
}
//push a stack element
void Stack::push(int value){
if(isFull()){
cout<<"Stack overflow\n";
}else{
element[++top]=value;
cout<<"\nPush stack element"<<value;
display();
}
}
//display element of Node
void Stack:: display(){
if(isEmpty()){
cout<<"\nEmpty Stack";
}else{
cout<<"\n Stack Element :";
int index=0;
for(index;index<=top;index++){
cout<<" "<<element[index];
}
}
}
//Remove top of stack element
void Stack :: pop(){
if(isEmpty()){
cout<<"\nEmpty Stack"<<endl;
}else{
cout<<"\nPop Stack Element "<<element[top] ;
top--;
display(); //display all stack element
}
}
int Stack ::isEmpty(){
if(top==-1){
return 1;
}else{
return 0;
}
}
int Stack ::isFull(){
if(top+1==limit){
return 1;
}else{
return 0;
}
}
int main(){
//create object
Stack obj(5);//set stack size
//push element of stack
obj.push(50);
obj.push(40);
obj.push(30);
obj.push(20);
obj.push(10);
//pop operation
obj.pop();
obj.pop();
obj.pop();
obj.pop();
obj.pop();
}
Output
Push stack element50
Stack Element : 50
Push stack element40
Stack Element : 50 40
Push stack element30
Stack Element : 50 40 30
Push stack element20
Stack Element : 50 40 30 20
Push stack element10
Stack Element : 50 40 30 20 10
Pop Stack Element 10
Stack Element : 50 40 30 20
Pop Stack Element 20
Stack Element : 50 40 30
Pop Stack Element 30
Stack Element : 50 40
Pop Stack Element 40
Stack Element : 50
Pop Stack Element 50
Empty Stack
//java implement stack using array
public class Stack{
static int top;
//set size of stack
static int limit;
static int element[];
//Class constructors
Stack(int size){
top=-1;
limit=size;
element=new int[size];
}
//insert stack element
static void push(int value){
if(top+1==limit){
System.out.println("\nStack is Full not push element "+value);
}else{
element[++top]=value;
System.out.println("\nPush element of Stack "+value);
display();
}
}
static void pop(){
if(top==-1){
System.out.println("Empty Stack ");
}else{
System.out.println("\nPop element of Stack "+element[top]);
top--;
display();
}
}
//display all stack elements
static void display(){
if(top!=-1){
int index=0;
for(index=0;index<=top;index++){
System.out.print(" "+element[index]);
}
}else{
System.out.println("Empty Stack");
}
}
public static void main(String[] args) {
Stack obj=new Stack(5);
obj.push(0);
obj.push(1);
obj.push(2);
obj.push(3);
obj.push(4);
obj.push(5);
obj.pop();
obj.pop();
obj.pop();
}
}
Output
Push element of Stack 0
0
Push element of Stack 1
0 1
Push element of Stack 2
0 1 2
Push element of Stack 3
0 1 2 3
Push element of Stack 4
0 1 2 3 4
Stack is Full not push element 5
Pop element of Stack 4
0 1 2 3
Pop element of Stack 3
0 1 2
Pop element of Stack 2
0 1
#create class Stack
class Stack:
def __init__(self,size):
#Assign default value
self.top=-1
self.limit=size
self.element=[]
#push new node to Stack
def push(self,data):
if self.top+1 >self.limit:
print("Stack is Full")
else:
self.top+=1
self.element.append(data)
print("Push Elements",self.element[self.top])
print("Stack Elements",self.element)
def pop(self):
if self.top==-1:
print("Empty Stack");
else:
print("Pop Elements",self.element[self.top])
self.top-=1
self.element.pop()
print("Stack Elements",self.element)
#Create Object of class Stack
Stack=Stack(4)
#Stack push operation
Stack.push(1)
Stack.push(2)
Stack.push(3)
Stack.push(4)
Stack.push(5)
#Pop operation
Stack.pop();
Stack.pop();
Stack.pop();
Output
('Push Elements', 1)
('Stack Elements', [1])
('Push Elements', 2)
('Stack Elements', [1, 2])
('Push Elements', 3)
('Stack Elements', [1, 2, 3])
('Push Elements', 4)
('Stack Elements', [1, 2, 3, 4])
('Push Elements', 5)
('Stack Elements', [1, 2, 3, 4, 5])
('Pop Elements', 5)
('Stack Elements', [1, 2, 3, 4])
('Pop Elements', 4)
('Stack Elements', [1, 2, 3])
('Pop Elements', 3)
('Stack Elements', [1, 2])
//c# program to implement stack using array
using System;
//Create a Stack class
public class Stack{
private int top;
private int[]element;
private int limit;
//constructor of class Stack
public Stack(int size){
//set initial stack top is null
top=-1;
limit=size;
element=new int[size];
}
//display all stack elements
public void display(){
if(top!=-1){
for(int index=0;index<=top;index++){
Console.Write(" "+element[index]);
}
}else{
Console.WriteLine("Empty Stack");
}
}
//insert stack element
public void push(int value){
if(top+1<limit){
element[++top]=value;
Console.WriteLine("\nPush data {0}",value);
display();
}else{
Console.WriteLine("\nStack is Full");
}
}
//delete stack elements
public void pop(){
if(top!=-1){
Console.WriteLine("\nPop data {0}",element[top]);
top--;
display();
}else{
Console.WriteLine("Empty Stack");
}
}
}
class Program{
static void Main(string[] args){
Stack obj=new Stack(5);
//insert stack elements
obj.push(1);
obj.push(2);
obj.push(3);
obj.push(4);
obj.push(5);
//Delete stack elements
obj.pop();
obj.pop();
obj.pop();
}
}
Output
Push data 1
1
Push data 2
1 2
Push data 3
1 2 3
Push data 4
1 2 3 4
Push data 5
1 2 3 4 5
Pop data 5
1 2 3 4
Pop data 4
1 2 3
Pop data 3
1 2
Linked list is solve the limitation of size in stack data structure. and that are suitable to create and allocated stack node as well.
//implement stack using linked list
#include<stdio.h>
#include <stdlib.h> //for malloc function
//create structure
struct Node{
int data;
struct Node*next;
};
//function prototype
void push(struct Node**,int);
void display(struct Node*);
void pop(struct Node**);
//insert Stack element
void push(struct Node**top,int value){
//Create dynamic node
struct Node*node=(struct Node*)malloc(sizeof(struct Node));
if(node==NULL){
printf("Memory overflow\n");
}else{
node->data=value;
node->next=*top;
*top=node;
printf("\n Push Stack element %d",value);
display(*top);
}
}
//pop Stack element
void pop(struct Node**top){
if(*top==NULL){
printf("Empty Stack\n");
}else{
struct Node*temp=*top;
*top=temp->next;
printf("\n Pop Stack element %d",temp->data);
free(temp);
temp=NULL;
display(*top);
}
}
//display element of Stack
void display(struct Node*temp){
if(temp!=NULL){
printf("\nStack Elements is : ");
}
while(temp!=NULL){
printf("%d ",temp->data);
temp=temp->next;
}
}
int main(){
struct Node*top=NULL;
push(&top,5);
push(&top,4);
push(&top,3);
push(&top,2);
push(&top,1);
pop(&top);
pop(&top);
pop(&top);
pop(&top);
}
Output
Push Stack element 5
Stack Elements is : 5
Push Stack element 4
Stack Elements is : 4 5
Push Stack element 3
Stack Elements is : 3 4 5
Push Stack element 2
Stack Elements is : 2 3 4 5
Push Stack element 1
Stack Elements is : 1 2 3 4 5
Pop Stack element 1
Stack Elements is : 2 3 4 5
Pop Stack element 2
Stack Elements is : 3 4 5
Pop Stack element 3
Stack Elements is : 4 5
Pop Stack element 4
Stack Elements is : 5
//Stack implemation By using Linked list
#include<iostream>
using namespace std;
//create structure
struct Node{
int data;
struct Node*next;
};
//Create a Stack class
class Stack{
public:
struct Node*top;
public:
//member function of class
Stack();
void push(int);
void pop();
void display();
};
//constructor of class
Stack::Stack(){
top=NULL;
}
//push a stack element
void Stack::push(int value){
//Create dynamic node
struct Node*node=new Node;
if(node==NULL){
cout<<"Memory overflow\n";
}else{
//push node at beginning of linked list
node->data=value;
node->next=top;
top=node;
printf("\n Push stack element %d\n",value );
printf(" After push Linked List :");
display();
}
}
//display element of Node
void Stack:: display(){
struct Node*temp=top;
if(temp==NULL){
cout<<" Empty Stack"<<endl;
}
//display stack element value
while(temp!=NULL){
cout<<" "<<temp->data;
temp=temp->next;
}
}
//Remove top of stack element
void Stack :: pop(){
if(top==NULL){
cout<<"Empty Linked List";
}else{
struct Node*temp=top;
printf("\n%d Pop Stack Element\n",temp->data );
top=temp->next;
free(temp);//remove top element
temp=NULL;
printf(" After pop Linked List :");
display(); //display all stack element
}
}
int main(){
//create object
Stack obj;
//push element of stack
obj.push(50);
obj.push(40);
obj.push(30);
obj.push(20);
obj.push(10);
//pop operation
obj.pop();
obj.pop();
obj.pop();
obj.pop();
obj.pop();
}

Output
Push stack element 50
After push Linked List : 50
Push stack element 40
After push Linked List : 40 50
Push stack element 30
After push Linked List : 30 40 50
Push stack element 20
After push Linked List : 20 30 40 50
Push stack element 10
After push Linked List : 10 20 30 40 50
10 Pop Stack Element
After pop Linked List : 20 30 40 50
20 Pop Stack Element
After pop Linked List : 30 40 50
30 Pop Stack Element
After pop Linked List : 40 50
40 Pop Stack Element
After pop Linked List : 50
50 Pop Stack Element
After pop Linked List : Empty Stack
//java implement MyStack using linked list
public class MyStack{
static Node top;
static class Node{
int data;
Node next;
}
//Class constructors
MyStack(){
top=null;
}
static void push(int value){
Node node=new Node();
node.next=top;
node.data=value;
top=node;
System.out.println("\nPush element of MyStack "+value);
display();
}
static void pop(){
if(top==null){
System.out.println("Empty MyStack ");
}else{
Node temp=top;
top=temp.next;
System.out.println("\nPop element of MyStack "+temp.data);
temp=null;
display();
}
}
//display all MyStack elements
static void display(){
if(top!=null){
System.out.print("MyStack Elements :");
Node temp=top;
while(temp!=null){
System.out.print(temp.data+" ");
temp=temp.next;
}
}else{
if(top==null)
System.out.println("Empty List");
}
}
public static void main(String[] args) {
top=null;//set top to null
MyStack obj=new MyStack();
obj.push(0);
obj.push(1);
obj.push(2);
obj.push(3);
obj.push(4);
obj.pop();
obj.pop();
obj.pop();
}
}

Output
Push element of Stack 0
Stack Elements :0
Push element of Stack 1
Stack Elements :1 0
Push element of Stack 2
Stack Elements :2 1 0
Push element of Stack 3
Stack Elements :3 2 1 0
Push element of Stack 4
Stack Elements :4 3 2 1 0
Pop element of Stack 4
Stack Elements :3 2 1 0
Pop element of Stack 3
Stack Elements :2 1 0
Pop element of Stack 2
Stack Elements :1 0
#create class Node
class Node:
def __init__(self,data):
self.data=data
self.next=None
#create class Stack
class Stack:
def __init__(self):
#Assign default value
self.top=None
#insert new node to Stack
def insert(self,data):
node=Node(data)
node.next=self.top
self.top=node
print("Push Stack Element {0} ".format(data))
#display all Stack list node
def display(self):
temp=self.top
while(temp!=None):
print(temp.data),
temp=temp.next
def pop(self):
if self.top==None:
print("Empty Stack");
else:
temp=self.top
self.top=temp.next
print("\nPop Stack Element {0} ".format(temp.data))
temp=None
self.display()
#Create Object of class Stack
Stack=Stack()
#Stack list insertion
Stack.insert(1)
Stack.insert(2)
Stack.insert(3)
Stack.insert(4)
Stack.insert(5)
Stack.pop();
Stack.pop();
Stack.pop();

Output
Push Stack Element 1
Push Stack Element 2
Push Stack Element 3
Push Stack Element 4
Push Stack Element 5
Pop Stack Element 5
4 3 2 1
Pop Stack Element 4
3 2 1
Pop Stack Element 3
2 1
//c# program to implement stack using linked list
using System;
//Create a Node class
public class Node{
public Node next;
public Object data;
}
//Create a Stack class
public class Stack{
private Node top;
//constructor of class Stack
public Stack(){
//set initial stack top is null
this.top=null;
}
//display all stack elements
public void display(){
if(top!=null){
Console.WriteLine("\nStack Elements");
Node temp=top;
while(temp!=null){
Console.Write(temp.data+" ");
temp=temp.next;
}
}else{
Console.WriteLine("Empty Stack");
}
}
//insert stack element
public void push(Object value){
Node node=new Node();
node.data=value;
node.next=top;
top=node;
Console.WriteLine("\nPush data {0}",value);
display();
}
//delete stack elements
public void pop(){
if(top!=null){
Node temp=top;
top=temp.next;
Console.WriteLine("\nPop data {0}",temp.data);
temp=null;
display();
}else{
Console.WriteLine("Empty Stack");
}
}
}
class Program{
static void Main(string[] args){
Stack obj=new Stack();
//insert stack elements
obj.push(1);
obj.push(2);
obj.push(3);
obj.push(4);
obj.push(5);
//Delete stack elements
obj.pop();
obj.pop();
obj.pop();
}
}
Output
Push data 1
Stack Elements
1
Push data 2
Stack Elements
2 1
Push data 3
Stack Elements
3 2 1
Push data 4
Stack Elements
4 3 2 1
Push data 5
Stack Elements
5 4 3 2 1
Pop data 5
Stack Elements
4 3 2 1
Pop data 4
Stack Elements
3 2 1
Pop data 3
Stack Elements
2 1
Stack Examples
Recursion is completely based on stack data structure. Because function calling execution are create new namespace of that function, and allocate memory of it's local variables. local variable are is parameter of function and declared variables of that function.
Application of stacks
There is lot of application of stack data structures.
Evaluation of Expression: Possible to evaluate the postfix, infix, perfix expression by using of stack
Recursion: function calling execution is managed by stack.
Complexity analysis
Operation | Complexity |
---|---|
Insertion | O(1) |
Deletion | O(1) |
Searching | O(n) |
Space | O(n) |
Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.
New Comment