IMPLEMENTATION OF
QUEUE USING ARRAY
AND LINKED LIST
Muzammil Khan
MC-403
IMPLEMENTATION OF QUEUE USING ARRAY
CODE:
#include <iostream>
#include <stdexcept> // For std::overflow_error and std::underflow_error
class QueueArray {
private:
int* arr;
int capacity;
int front_idx;
int rear_idx;
int count;
public:
QueueArray(int size) {
capacity = size;
arr = new int[capacity];
front_idx = 0;
rear_idx = -1;
count = 0;
}
~QueueArray() {
delete[] arr;
}
void enqueue(int item) {
if (isFull()) {
throw std::overflow_error("Queue is full");
}
rear_idx = (rear_idx + 1) % capacity;
arr[rear_idx] = item;
count++;
}
int dequeue() {
if (isEmpty()) {
throw std::underflow_error("Queue is empty");
}
int item = arr[front_idx];
front_idx = (front_idx + 1) % capacity;
count--;
return item;
}
int peek() {
if (isEmpty()) {
throw std::underflow_error("Queue is empty");
}
return arr[front_idx];
}
bool isEmpty() {
return count == 0;
}
bool isFull() {
return count == capacity;
}
int getSize() { // Renamed from size() to avoid potential conflicts
return count;
}
};
int main() {
try {
QueueArray q(5);
[Link](10);
[Link](20);
[Link](30);
std::cout << "Dequeued item: " << [Link]() << std::endl; //
Expected: 10
std::cout << "Front item: " << [Link]() << std::endl; // Expected: 20
std::cout << "Queue size: " << [Link]() << std::endl; // Expected:
2
[Link](40);
[Link](50);
// [Link](60); // This would throw std::overflow_error
std::cout << "Queue elements: ";
while (![Link]()) {
std::cout << [Link]() << " ";
}
std::cout << std::endl;
// [Link](); // This would throw std::underflow_error
// [Link](); // This would throw std::underflow_error
} catch (const std::exception& e) {
std::cerr << "Exception: " << [Link]() << std::endl;
}
return 0;
}
RESULT:
IMPLEMENTATION OF QUEUE USING LINKED LIST:
CODE:
#include <iostream>
#include <stdexcept> // For std::underflow_error
struct Node {
int data;
Node* next;
Node(int val) : data(val), next(nullptr) {}
};
class QueueLinkedList {
private:
Node* front_node;
Node* rear_node;
int count;
public:
QueueLinkedList() : front_node(nullptr),
rear_node(nullptr), count(0) {}
~QueueLinkedList() {
while (!isEmpty()) {
dequeue();
}
}
void enqueue(int item) {
Node* newNode = new Node(item);
if (isEmpty()) {
front_node = newNode;
rear_node = newNode;
} else {
rear_node->next = newNode;
rear_node = newNode;
}
count++;
}
int dequeue() {
if (isEmpty()) {
throw std::underflow_error("Queue is empty");
}
Node* temp = front_node;
int item = temp->data;
front_node = front_node->next;
delete temp;
count--;
if (isEmpty()) { // If queue becomes empty after
dequeue
rear_node = nullptr;
}
return item;
}
int peek() {
if (isEmpty()) {
throw std::underflow_error("Queue is empty");
}
return front_node->data;
}
bool isEmpty() {
return count == 0; // Or front_node == nullptr
}
int getSize() { // Renamed from size() to avoid potential
conflicts
return count;
}
};
int main() {
try {
QueueLinkedList q;
[Link](10);
[Link](20);
[Link](30);
std::cout << "Dequeued item: " << [Link]() <<
std::endl; // Expected: 10
std::cout << "Front item: " << [Link]() <<
std::endl; // Expected: 20
std::cout << "Queue size: " << [Link]() <<
std::endl; // Expected: 2
[Link](40);
[Link](50);
std::cout << "Queue elements: ";
while (![Link]()) {
std::cout << [Link]() << " ";
}
std::cout << std::endl;
// [Link](); // This would throw
std::underflow_error
// [Link](); // This would throw std::underflow_error
} catch (const std::exception& e) {
std::cerr << "Exception: " << [Link]() << std::endl;
}
return 0;
}
RESULT: