Mental Model
A deque lets you add or remove items from both the front and the back easily.
Analogy: Think of a line of people where you can join or leave from either the front or the end of the line.
front -> [ ] -> [ ] -> [ ] -> back ↑head ↑tail
front -> [ ] -> [ ] -> [ ] -> back ↑head ↑tail
front -> [10] -> back ↑head/tail
front -> [10] -> [20] -> back ↑head ↑tail
front -> [5] -> [10] -> [20] -> back ↑head ↑tail
front -> [5] -> [10] -> back ↑head ↑tail
front -> [5] -> [10] -> back ↑head ↑tail
#include <stdio.h> #include <stdlib.h> #define MAX 5 typedef struct { int arr[MAX]; int front; int rear; } Deque; void initDeque(Deque* dq) { dq->front = -1; dq->rear = -1; } int isEmpty(Deque* dq) { return dq->front == -1; } int isFull(Deque* dq) { return ((dq->front == 0 && dq->rear == MAX - 1) || (dq->front == dq->rear + 1)); } void addFront(Deque* dq, int val) { if (isFull(dq)) { printf("Deque is full\n"); return; } if (isEmpty(dq)) { dq->front = 0; dq->rear = 0; } else if (dq->front == 0) { dq->front = MAX - 1; } else { dq->front = dq->front - 1; } dq->arr[dq->front] = val; } void addRear(Deque* dq, int val) { if (isFull(dq)) { printf("Deque is full\n"); return; } if (isEmpty(dq)) { dq->front = 0; dq->rear = 0; } else if (dq->rear == MAX - 1) { dq->rear = 0; } else { dq->rear = dq->rear + 1; } dq->arr[dq->rear] = val; } void removeFront(Deque* dq) { if (isEmpty(dq)) { printf("Deque is empty\n"); return; } if (dq->front == dq->rear) { dq->front = -1; dq->rear = -1; } else if (dq->front == MAX - 1) { dq->front = 0; } else { dq->front = dq->front + 1; } } void removeRear(Deque* dq) { if (isEmpty(dq)) { printf("Deque is empty\n"); return; } if (dq->front == dq->rear) { dq->front = -1; dq->rear = -1; } else if (dq->rear == 0) { dq->rear = MAX - 1; } else { dq->rear = dq->rear - 1; } } void printDeque(Deque* dq) { if (isEmpty(dq)) { printf("Deque is empty\n"); return; } int i = dq->front; printf("Deque: "); while (1) { printf("%d ", dq->arr[i]); if (i == dq->rear) break; i = (i + 1) % MAX; } printf("\n"); } int main() { Deque dq; initDeque(&dq); addFront(&dq, 10); // Step 1 printDeque(&dq); addRear(&dq, 20); // Step 2 printDeque(&dq); addFront(&dq, 5); // Step 3 printDeque(&dq); removeRear(&dq); // Step 4 printDeque(&dq); return 0; }
if (isFull(dq)) { ... return; }if (isEmpty(dq)) { dq->front = 0; dq->rear = 0; }dq->front = (dq->front == 0) ? MAX - 1 : dq->front - 1;dq->rear = (dq->rear == MAX - 1) ? 0 : dq->rear + 1;if (dq->front == dq->rear) { dq->front = -1; dq->rear = -1; }dq->front = (dq->front == MAX - 1) ? 0 : dq->front + 1;dq->rear = (dq->rear == 0) ? MAX - 1 : dq->rear - 1;while (1) { print arr[i]; if (i == rear) break; i = (i + 1) % MAX; }if (isEmpty(dq)) { printf("Deque is empty\n"); return; }
if (isFull(dq)) { printf("Deque is full\n"); return; }
if (dq->front == dq->rear) { dq->front = -1; dq->rear = -1; }