Essential 4
Essential 4
private:
Node *front, *rear;
public:
Queue() : front(nullptr), rear(nullptr) {}
void dequeue() {
if (front == nullptr) {
std::cout << "Queue Underflow\n";
return;
}
Node* temp = front;
front = front->next;
if (front == nullptr) rear = nullptr; // Reset rear if queue
,→ becomes empty
delete temp;
}
int peek() {
if (front == nullptr) {
std::cout << "Queue is Empty\n";
return -1;
40
}
return front->data;
}
bool isEmpty() {
return front == nullptr;
}
void display() {
Node* temp = front;
while (temp != nullptr) {
std::cout << temp->data << " ";
temp = temp->next;
}
std::cout << "\n";
}
˜Queue() {
while (front != nullptr) {
dequeue();
}
}
};
int main() {
Queue q;
q.enqueue(10);
q.enqueue(20);
q.enqueue(30);
q.display();
q.dequeue();
41
q.display();
return 0;
}
Using STL
The std::queue container in STL simplifies queue implementation.
Code Example:
#include <iostream>
#include <queue>
int main() {
std::queue<int> q;
q.push(10);
q.push(20);
q.push(30);
q.pop();
std::cout << "After dequeue, front element: " << q.front() << "\n";
return 0;
}
Code Example:
#include <iostream>
#include <deque>
int main() {
std::deque<int> dq;
dq.push_back(10);
dq.push_front(20);
dq.push_back(30);
dq.pop_front();
dq.pop_back();
return 0;
}
Priority Queue
A priority queue stores elements based on their priority rather than insertion order. In C++,
std::priority queue uses a max-heap by default.
Code Example:
#include <iostream>
#include <queue>
#include <vector>
int main() {
std::priority_queue<int> pq;
pq.push(30);
pq.push(10);
pq.push(20);
pq.pop();
std::cout << "After pop, top element: " << pq.top() << "\n";
return 0;
}
3. Data Stream Management Buffers in data streaming services often rely on queues.
5. Priority Queue in Pathfinding Priority queues are critical in algorithms like Dijkstra's
for shortest path computation.
Conclusion
Queues and their variants (Deque, Priority Queue) play a vital role in solving real-world
problems efficiently. Mastering their implementation and applications enhances your C++
programming skills and prepares you for advanced concepts. This chapter lays the foundation
for understanding more complex data structures like trees and graphs, covered in upcoming
chapters.
Chapter 5
Trees
• Parent and Child Nodes: A parent node has one or more children connected via edges.
45
46
• Height: The longest path from the root node to any leaf node.
• Binary trees are widely used for search operations and data representation.
• The two subtrees (left and right) of a node are themselves binary trees.
Applications:
#include <iostream>
using namespace std;
struct Node {
int data;
47
Node* left;
Node* right;
class BinaryTree {
public:
Node* root;
BinaryTree() : root(nullptr) {}
};
int main() {
BinaryTree tree;
tree.root = new Node(1);
tree.root->left = new Node(2);
tree.root->right = new Node(3);
tree.root->left->left = new Node(4);
tree.root->left->right = new Node(5);
return 0;
}
Properties
• Time complexity:
Implementation of BST
Code Example:
struct BSTNode {
int data;
BSTNode* left;
BSTNode* right;
class BST {
private:
BSTNode* insert(BSTNode* node, int value) {
if (node == nullptr) return new BSTNode(value);
if (value < node->data)
node->left = insert(node->left, value);
else
node->right = insert(node->right, value);
return node;
}
public:
BSTNode* root;
BST() : root(nullptr) {}