Added Double ended queue to C(#126)
* Added double ended queue using array * replace space( ) to dash(-) * remove space complexity removed space complexity because i did know how to check space complexity * done the requested changes * update queue index readme add double-ended-queue-using-array.c under c-or-cpp Co-authored-by: Arsenic <54987647+Arsenic-ATG@users.noreply.github.com>pull/134/head
parent
84053d436f
commit
072f928379
|
@ -4,3 +4,4 @@
|
||||||
|
|
||||||
1. [Queue using linked list](c-or-cpp/queue-linked-list.cpp)
|
1. [Queue using linked list](c-or-cpp/queue-linked-list.cpp)
|
||||||
2. [Circular Queue using linked list](c-or-cpp/circular-queue-linked-list.cpp)
|
2. [Circular Queue using linked list](c-or-cpp/circular-queue-linked-list.cpp)
|
||||||
|
3. [Double Ended Queue (using arrays)](c-or-cpp/double-ended-queue-using-array.c)
|
||||||
|
|
|
@ -0,0 +1,203 @@
|
||||||
|
/* this is a double ended queue implementation using array
|
||||||
|
means you can insert or delete data from both front and rear */
|
||||||
|
//included necessary header file
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<stdlib.h>
|
||||||
|
// creating non-primitive named deque using structure concept
|
||||||
|
struct deque
|
||||||
|
{
|
||||||
|
//declaring necessary variable
|
||||||
|
int front;
|
||||||
|
int rear;
|
||||||
|
int capacity;
|
||||||
|
int *arr;
|
||||||
|
|
||||||
|
};
|
||||||
|
// clear function for different platforms ( currently only windows and unix based os are supported )
|
||||||
|
void clear_screen()
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
system("cls");
|
||||||
|
#elif __unix__
|
||||||
|
system("clear");
|
||||||
|
#else
|
||||||
|
printf("clear screen not supported\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
//create deque function mainly give memory to the non-primitive variable deque
|
||||||
|
struct deque* create_dequeue(int cap)
|
||||||
|
{
|
||||||
|
struct deque *array;
|
||||||
|
// dynamically giving memory
|
||||||
|
array=(struct deque*)malloc(sizeof(struct deque));
|
||||||
|
// declaring default value of cap front rear
|
||||||
|
array->capacity=cap;
|
||||||
|
array->front=-1;
|
||||||
|
array->rear=-1;
|
||||||
|
// dynamically giving memory
|
||||||
|
array->arr=(int*)malloc(sizeof(int)*cap);
|
||||||
|
return(array);
|
||||||
|
}
|
||||||
|
// insertion front just insert data from front of queue
|
||||||
|
void insertion_front(struct deque *array,int data)
|
||||||
|
{
|
||||||
|
// checking that whether the queue is not full
|
||||||
|
if(array->rear+1==array->front||array->rear==array->capacity-1&&array->front==0)
|
||||||
|
printf("queue is full");
|
||||||
|
//checking is the front equal to -1 means queue is empty or not
|
||||||
|
else if(array->front==-1)
|
||||||
|
{
|
||||||
|
array->front=0;
|
||||||
|
array->rear=0;
|
||||||
|
array->arr[array->front]=data;
|
||||||
|
}
|
||||||
|
// checking whether the queue has 1 data or not
|
||||||
|
else if(array->front==0)
|
||||||
|
{
|
||||||
|
array->front=array->capacity-1;
|
||||||
|
array->arr[array->front]=data;
|
||||||
|
}
|
||||||
|
// normal condition
|
||||||
|
else
|
||||||
|
{
|
||||||
|
array->front--;
|
||||||
|
array->arr[array->front]=data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// insertion rear basically insert data from end of a queue
|
||||||
|
void insertion_rear(struct deque *array,int data)
|
||||||
|
{
|
||||||
|
//checking is the front equal to -1 means queue is empty or not
|
||||||
|
if(array->rear==array->capacity-1&&array->front==0||array->rear+1==array->front)
|
||||||
|
printf("queue is full");
|
||||||
|
//checking is the rear equal to -1 means queue is empty or not
|
||||||
|
else if(array->rear==-1)
|
||||||
|
{
|
||||||
|
array->rear++;
|
||||||
|
array->arr[array->rear]=data;
|
||||||
|
array->front=array->rear;
|
||||||
|
}
|
||||||
|
// checking whether queue is full from rear but not from front
|
||||||
|
else if(array->rear==array->capacity-1&&array->front!=0)
|
||||||
|
{
|
||||||
|
array->rear=0;
|
||||||
|
array->arr[array->rear]=data;
|
||||||
|
}
|
||||||
|
// normal condition
|
||||||
|
else
|
||||||
|
{
|
||||||
|
array->rear++;
|
||||||
|
array->arr[array->rear]=data;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// deletion front basically delete data from front of queue
|
||||||
|
void deletion_front(struct deque *array)
|
||||||
|
{
|
||||||
|
// queue empty condition
|
||||||
|
if(array->front==-1)
|
||||||
|
printf("queue is empty");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// printing the value which is going to be deleted
|
||||||
|
printf("deleted value is %d",array->arr[array->front]);
|
||||||
|
// checking whether the queue has only one data
|
||||||
|
if(array->front==array->rear)
|
||||||
|
{
|
||||||
|
array->front=-1;
|
||||||
|
array->rear=-1;
|
||||||
|
}
|
||||||
|
// checking whether front is equal to capacity-1
|
||||||
|
else if(array->front==array->capacity-1)
|
||||||
|
array->front=0;
|
||||||
|
// normal condition
|
||||||
|
else
|
||||||
|
array->front++;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// deletion rear basically delete data from end of queue
|
||||||
|
void deletion_rear(struct deque *array)
|
||||||
|
{
|
||||||
|
//empty condition
|
||||||
|
if(array->rear==-1)
|
||||||
|
printf("queue is empty");
|
||||||
|
else
|
||||||
|
{ printf("deleted value is %d",array->arr[array->rear]);
|
||||||
|
// checking whether the queue has only one data
|
||||||
|
if(array->rear==array->front)
|
||||||
|
{
|
||||||
|
array->front=-1;
|
||||||
|
array->rear=-1;
|
||||||
|
}
|
||||||
|
// checking whether rear is 0 but there not only one data left that means that data are at end of queue
|
||||||
|
else if(array->rear==0)
|
||||||
|
array->rear=array->capacity-1;
|
||||||
|
//normal condition
|
||||||
|
else
|
||||||
|
array->rear--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// menu basically provide the no. of task can be performed so you can choose one of them
|
||||||
|
int menu(void)
|
||||||
|
{
|
||||||
|
int choice;
|
||||||
|
printf("\n1: Insertion at Front");
|
||||||
|
printf("\n2: Insertion at Rear");
|
||||||
|
printf("\n3: Deletion at Front");
|
||||||
|
printf("\n4: Deletion at Rear");
|
||||||
|
printf("\n5: exit");
|
||||||
|
printf("\n\n enter your choice");
|
||||||
|
scanf("%d",&choice);
|
||||||
|
return(choice);
|
||||||
|
}
|
||||||
|
// driver code
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
struct deque *array;
|
||||||
|
int cap,data;
|
||||||
|
printf("enter the capacity");
|
||||||
|
scanf("%d",&cap);
|
||||||
|
array=create_dequeue(cap);
|
||||||
|
while(1)
|
||||||
|
{ clear_screen();
|
||||||
|
switch(menu())
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
printf("enter value");
|
||||||
|
scanf("%d",&data);
|
||||||
|
insertion_front(array,data);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
printf("enter value ");
|
||||||
|
scanf("%d",&data);
|
||||||
|
insertion_rear(array,data);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
deletion_front(array);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
deletion_rear(array);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Input: Insert 3 at front
|
||||||
|
Insert 2 at rear
|
||||||
|
Insert 5 at rear
|
||||||
|
Delete from rear
|
||||||
|
delete from front
|
||||||
|
Output:
|
||||||
|
5 had been deleted
|
||||||
|
3 had been deleted
|
||||||
|
Time complexity:O(n)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
Loading…
Reference in New Issue