Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
19 views

Queue C Programs - Array

This document contains code for implementing priority queues in C using arrays. It includes implementations of both ordered and unordered priority queues. The ordered priority queue implementation uses a linear search to find and remove the highest priority element in O(n) time. The unordered implementation uses an index-based approach to enqueue and dequeue elements in O(1) time but requires a linear search to find the highest priority element. Examples are provided to demonstrate inserting elements with different priorities and removing the highest priority elements from each implementation.

Uploaded by

Nikhil Kachhawah
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
19 views

Queue C Programs - Array

This document contains code for implementing priority queues in C using arrays. It includes implementations of both ordered and unordered priority queues. The ordered priority queue implementation uses a linear search to find and remove the highest priority element in O(n) time. The unordered implementation uses an index-based approach to enqueue and dequeue elements in O(1) time but requires a linear search to find the highest priority element. Examples are provided to demonstrate inserting elements with different priorities and removing the highest priority elements from each implementation.

Uploaded by

Nikhil Kachhawah
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 19

// Standard Queue implementation in C

#include <stdio.h>
#define SIZE 5

void enQueue(int);
void deQueue();
void display();

int items[SIZE], front = -1, rear = -1;

int main() {
//deQueue is not possible on empty queue
deQueue();

//enQueue 5 elements
enQueue(1);
enQueue(2);
enQueue(3);
enQueue(4);
enQueue(5);

// 6th element can't be added to because the queue is full


enQueue(6);

display();

//deQueue removes element entered first i.e. 1


deQueue();

//Now we have just 4 elements


display();

return 0;
}

void enQueue(int value) {


if (rear == SIZE - 1)
printf("\nQueue is Full!!");
else {
if (front == -1)
front = 0;
rear++;
items[rear] = value;
printf("\nInserted -> %d", value);
}
}
void deQueue() {
if (front == -1)
printf("\nQueue is Empty!!");
else {
printf("\nDeleted : %d", items[front]);
front++;
if (front > rear)
front = rear = -1;
}
}

// Function to print the queue


void display() {
if (rear == -1)
printf("\nQueue is Empty!!!");
else {
int i;
printf("\nQueue elements are:\n");
for (i = front; i <= rear; i++)
printf("%d ", items[i]);
}
printf("\n");
}

Output

Queue is Empty!!
Inserted -> 1
Inserted -> 2
Inserted -> 3
Inserted -> 4
Inserted -> 5
Queue is Full!!
Queue elements are:
1 2 3 4 5

Deleted : 1
Queue elements are:
2 3 4 5
// Circular Queue implementation in C

#include <stdio.h>

#define SIZE 5

int items[SIZE];
int front = -1, rear = -1;

// Check if the queue is full


int isFull() {
if ((front == rear + 1) || (front == 0 && rear == SIZE - 1)) return 1;
return 0;
}

// Check if the queue is empty


int isEmpty() {
if (front == -1) return 1;
return 0;
}

// Adding an element
void enQueue(int element) {
if (isFull())
printf("\n Queue is full!! \n");
else {
if (front == -1) front = 0;
rear = (rear + 1) % SIZE;
items[rear] = element;
printf("\n Inserted -> %d", element);
}
}

// Removing an element
int deQueue() {
int element;
if (isEmpty()) {
printf("\n Queue is empty !! \n");
return (-1);
} else {
element = items[front];
if (front == rear) {
front = -1;
rear = -1;
}
// Q has only one element, so we reset the
// queue after dequeing it. ?
else {
front = (front + 1) % SIZE;
}
printf("\n Deleted element -> %d \n", element);
return (element);
}
}

// Display the queue


void display() {
int i;
if (isEmpty())
printf(" \n Empty Queue\n");
else {
printf("\n Front -> %d ", front);
printf("\n Items -> ");
for (i = front; i != rear; i = (i + 1) % SIZE) {
printf("%d ", items[i]);
}
printf("%d ", items[i]);
printf("\n Rear -> %d \n", rear);
}
}

int main() {
// Fails because front = -1
deQueue();

enQueue(1);
enQueue(2);
enQueue(3);
enQueue(4);
enQueue(5);

// Fails to enqueue because front == 0 && rear == SIZE - 1


enQueue(6);

display();
deQueue();

display();

enQueue(7);
display();
// Fails to enqueue because front == rear + 1
enQueue(8);

return 0;
}

Output

Queue is empty !!
Inserted -> 1
Inserted -> 2
Inserted -> 3
Inserted -> 4
Inserted -> 5
Queue is full!!
Front -> 0
Items -> 1 2 3 4 5
Rear -> 4
Deleted element -> 1
Front -> 1
Items -> 2 3 4 5
Rear -> 4
Inserted -> 7
Front -> 1
Items -> 2 3 4 5 7
Rear -> 0
Queue is full!!
// Priority Queue Implementation in C using array

#include <stdio.h>
#include <stdlib.h>
#define MAX 10

void create_queue();
void insert_element(int);
void delete_element(int);
void check_priority(int);
void display_priorityqueue();

int pqueue[MAX];
int front, rear;

void main()
{
int n, choice;
printf("\nEnter 1 to insert element by priority ");
printf("\nEnter 2 to delete element by priority ");
printf("\nEnter 3 to display priority queue ");
printf("\nEnter 4 to exit");
create_queue();
while (1)
{
printf("\nEnter your choice : ");
scanf("%d", &choice);
switch(choice)
{
case 1:
printf("\nEnter element to insert : ");
scanf("%d",&n);
insert_element(n);
break;
case 2:
printf("\nEnter element to delete : ");
scanf("%d",&n);
delete_element(n);
break;
case 3:
display_priorityqueue();
break;
case 4:
exit(0);
default:
printf("\n Please enter valid choice");
}
}
}
void create_queue()
{
front = rear = -1;
}
void insert_element(int data)
{
if (rear >= MAX - 1)
{
printf("\nQUEUE OVERFLOW");
return;
}
if ((front == -1) && (rear == -1))
{
front++;
rear++;
pqueue[rear] = data;
return;
}
else
check_priority(data);
rear++;
}
void check_priority(int data)
{
int i,j;
for (i = 0; i <= rear; i++)
{
if (data >= pqueue[i])
{
for (j = rear + 1; j > i; j--)
{
pqueue[j] = pqueue[j - 1];
}
pqueue[i] = data;
return;
}
}
pqueue[i] = data;
}
void delete_element(int data)
{
int i;
if ((front==-1) && (rear==-1))
{
printf("\nEmpty Queue");
return;
}
for (i = 0; i <= rear; i++)
{
if (data == pqueue[i])
{
for (; i < rear; i++)
{
pqueue[i] = pqueue[i + 1];
}
pqueue[i] = -99;
rear--;
if (rear == -1)
front = -1;
return;
}
}
printf("\n%d element not found in queue", data);
}
void display_priorityqueue()
{
if ((front == -1) && (rear == -1))
{
printf("\nEmpty Queue ");
return;
}
for (; front <= rear; front++)
{
printf(" %d ", pqueue[front]);
}
front = 0;
}

Output

Enter 1 to insert element by priority


Enter 2 to delete element by priority
Enter 3 to display priority queue
Enter 4 to exit
Enter your choice : 1
Enter element to insert : 10
Enter your choice : 3
10
Enter your choice : 1
Enter element to insert : 11
Enter your choice : 1
Enter element to insert : 3
Enter your choice : 1
Enter element to insert : 4
Enter your choice : 1
Enter element to insert : 8
Enter your choice : 3
11 10 8 4 3
Enter your choice : 2
Enter element to delete : 10
Enter your choice : 3
11 8 4 3
Enter your choice : 4
// C Program implementation of Priority Queue – Unordered using array (Max Priority
Queue)
// to implement min priority queue you can just change greater than sign to smaller than
at // the time of comparison and initialisation of maxPriority

#include<stdio.h>
#include<limits.h>

#define MAX 100

// denotes where the last item in priority queue is


// initialized to -1 since no item is in queue
int idx = -1;

// pqVal holds data for each index item


// pqPriority holds priority for each index item
int pqVal[MAX];
int pqPriority[MAX];

int isEmpty ()
{
return idx == -1;
}

int
isFull ()
{
return idx == MAX - 1;
}

// enqueue just adds item to the end of the priority queue | O(1)
void enqueue (int data, int priority)
{
if (!isFull ())
{
// Increase the index
idx++;

// Insert the element in priority queue


pqVal[idx] = data;
pqPriority[idx] = priority;
}
}
// returns item with highest priority
// NOTE: Max Priority Queue High priority number means higher priority | O(N)
int peek ()
{
// Note : Max Priority, so assigned min value as initial value
int maxPriority = INT_MIN;
int indexPos = -1;

// Linear search for highest priority


for (int i = 0; i <= idx; i++)
{
// If two items have same priority choose the one with
// higher data value
if (maxPriority == pqPriority[i] && indexPos > -1
&& pqVal[indexPos] < pqVal[i])
{
maxPriority = pqPriority[i];
indexPos = i;
}
// note: using MAX Priority so higher priority number
// means higher priority
else if (maxPriority < pqPriority[i])
{
maxPriority = pqPriority[i];
indexPos = i;
}
}
// Return index of the element where
return indexPos;
}

// This removes the element with highest priority


// from the priority queue | O(N)
void dequeue ()
{
if (!isEmpty ())
{
// Get element with highest priority
int indexPos = peek ();

// reduce size of priority queue by first


// shifting all elements one position left
// from index where the highest priority item was found
for (int i = indexPos; i < idx; i++)
{
pqVal[i] = pqVal[i + 1];
pqPriority[i] = pqPriority[i + 1];
}
// reduce size of priority queue by 1
idx--;
}
}

void display ()
{
for (int i = 0; i <= idx; i++)
{
printf ("(%d, %d)\n", pqVal[i], pqPriority[i]);
}
}

int main ()
{
// To enqueue items as per priority
enqueue (5, 1);
enqueue (10, 3);
enqueue (15, 4);
enqueue (20, 5);
enqueue (500, 2);

printf ("Before Dequeue : \n");


display ();

// Dequeue the top element


dequeue (); // 20 dequeued
dequeue (); // 15 dequeued

printf ("\nAfter Dequeue : \n");


display ();

return 0;
}

Output

Before Dequeue :
(5, 1)
(10, 3)
(15, 4)
(20, 5)
(500, 2)
After Dequeue :
(5, 1)
(10, 3)
(500, 2)
// C Program implementation of Priority Queue – Ordered using array (Max Priority
Queue)
// to implement min priority queue you can just change greater than sign to smaller than
at // the time of comparison and initialisation of maxPriority

#include<stdio.h>
#include<limits.h>
#define MAX 100

// denotes where the last item in priority queue is


// initialized to -1 since no item is in queue
int idx = -1;

// pqVal holds data for each index item


// pqPriority holds priority for each index item
int pqVal[MAX];
int pqPriority[MAX];

int isEmpty ()
{
return idx == -1;
}

int
isFull ()
{
return idx == MAX - 1;
}

// Insert the element in maintaining items in sorted order


// of their priority
void enqueue (int data, int priority)
{
if (!isFull ())
{
// first item being entered
if (idx == -1)
{
idx++; // increase the index
pqVal[idx] = data;
pqPriority[idx] = priority;
return;
}
else
{
// Increase the index
idx++;
// in reverse order
for (int i = idx - 1; i >= 0; i--)
{
// shift all items rightwards with higher priority
// than the element we trying to insert
if (pqPriority[i] >= priority)
{
pqVal[i + 1] = pqVal[i];
pqPriority[i + 1] = pqPriority[i];
}
else
{
// insert item just before where
// lower priority index was found
pqVal[i + 1] = data;
pqPriority[i + 1] = priority;
break;
}
}
}
}
}

// returns item with highest priority


// note highest priority in max priority queue is last item in array
int peek ()
{
return idx;
}

// just reducing index would mean we have dequed


// the value would be sitll there but we can say that
// no more than a garbage value
void dequeue ()
{
idx--;
}

void display ()
{
for (int i = 0; i <= idx; i++)
{
printf ("(%d, %d)\n", pqVal[i], pqPriority[i]);
}
}

int main ()
{
// To enqueue items as per priority
enqueue (25, 1);
enqueue (10, 10);
enqueue (15, 50);
enqueue (20, 100);
enqueue (30, 5);
enqueue (40, 7);

printf ("Before Dequeue : \n");


display ();

// // Dequeue the top element


dequeue (); // 20 dequeued
dequeue (); // 15 dequeued

printf ("\nAfter Dequeue : \n");


display ();

return 0;
}

Output

Before Dequeue :
(25, 1)
(30, 5)
(40, 7)
(10, 10)
(15, 50)
(20, 100)
After Dequeue :
(25, 1)
(30, 5)
(40, 7)
(10, 10)
// C Program for Deque using array

// Deque implementation in C

#include <stdio.h>

#define MAX 10

void addFront(int *, int, int *, int *);


void addRear(int *, int, int *, int *);
int delFront(int *, int *, int *);
int delRear(int *, int *, int *);
void display(int *);
int count(int *);

int main() {
int arr[MAX];
int front, rear, i, n;

front = rear = -1;


for (i = 0; i < MAX; i++)
arr[i] = 0;

addRear(arr, 5, &front, &rear);


addFront(arr, 12, &front, &rear);
addRear(arr, 11, &front, &rear);
addFront(arr, 5, &front, &rear);
addRear(arr, 6, &front, &rear);
addFront(arr, 8, &front, &rear);

printf("\nElements in a deque: ");


display(arr);

i = delFront(arr, &front, &rear);


printf("\nremoved item: %d", i);

printf("\nElements in a deque after deletion: ");


display(arr);

addRear(arr, 16, &front, &rear);


addRear(arr, 7, &front, &rear);

printf("\nElements in a deque after addition: ");


display(arr);

i = delRear(arr, &front, &rear);


printf("\nremoved item: %d", i);

printf("\nElements in a deque after deletion: ");


display(arr);

n = count(arr);
printf("\nTotal number of elements in deque: %d", n);
}

void addFront(int *arr, int item, int *pfront, int *prear) {


int i, k, c;

if (*pfront == 0 && *prear == MAX - 1) {


printf("\nDeque is full.\n");
return;
}

if (*pfront == -1) {
*pfront = *prear = 0;
arr[*pfront] = item;
return;
}

if (*prear != MAX - 1) {
c = count(arr);
k = *prear + 1;
for (i = 1; i <= c; i++) {
arr[k] = arr[k - 1];
k--;
}
arr[k] = item;
*pfront = k;
(*prear)++;
} else {
(*pfront)--;
arr[*pfront] = item;
}
}

void addRear(int *arr, int item, int *pfront, int *prear) {


int i, k;

if (*pfront == 0 && *prear == MAX - 1) {


printf("\nDeque is full.\n");
return;
}
if (*pfront == -1) {
*prear = *pfront = 0;
arr[*prear] = item;
return;
}

if (*prear == MAX - 1) {
k = *pfront - 1;
for (i = *pfront - 1; i < *prear; i++) {
k = i;
if (k == MAX - 1)
arr[k] = 0;
else
arr[k] = arr[i + 1];
}
(*prear)--;
(*pfront)--;
}
(*prear)++;
arr[*prear] = item;
}

int delFront(int *arr, int *pfront, int *prear) {


int item;

if (*pfront == -1) {
printf("\nDeque is empty.\n");
return 0;
}

item = arr[*pfront];
arr[*pfront] = 0;

if (*pfront == *prear)
*pfront = *prear = -1;
else
(*pfront)++;

return item;
}

int delRear(int *arr, int *pfront, int *prear) {


int item;

if (*pfront == -1) {
printf("\nDeque is empty.\n");
return 0;
}

item = arr[*prear];
arr[*prear] = 0;
(*prear)--;
if (*prear == -1)
*pfront = -1;
return item;
}

void display(int *arr) {


int i;

printf("\n front: ");


for (i = 0; i < MAX; i++)
printf(" %d", arr[i]);
printf(" :rear");
}

int count(int *arr) {


int c = 0, i;

for (i = 0; i < MAX; i++) {


if (arr[i] != 0)
c++;
}
return c;
}

Output

Elements in a deque:
front: 8 5 12 5 11 6 0 0 0 0 :rear
removed item: 8
Elements in a deque after deletion:
front: 0 5 12 5 11 6 0 0 0 0 :rear
Elements in a deque after addition:
front: 0 5 12 5 11 6 16 7 0 0 :rear
removed item: 7
Elements in a deque after deletion:
front: 0 5 12 5 11 6 16 0 0 0 :rear
Total number of elements in deque: 6

You might also like