#include<bits/stdc++.h>
using namespace std;
template <typename Type>
class Node{
public:
Type data;
Node<Type>* next;
// Constructor
Node(const Type& value){
this->data = value;
this->next = nullptr;
}
};
template <typename Type>
class Queue{
private:
Node<Type>* front;
Node<Type>* rear;
int maxSize, length;
public:
Queue(){
front = nullptr;
rear = nullptr;
length = 0;
maxSize = 10000;
}
/// check if queue is full
bool isFull(){
if(length == maxSize)
return true;
else
return false;
}
/// check if queue is empty
bool isEmpty(){
if(length == 0)
return true;
else
return false;
}
/// get front element
Type getFront(){
if(isEmpty()){
throw runtime_error("Queue is empty");
}
return front->data;
}
/// get rear element
Type getRear(){
if(isEmpty()){
throw runtime_error("Queue is empty");
}
return rear->data;
}
/// get length
int getLength(){
return length;
}
/// insert (enqueue)
void enqueue(Type key){
if(isFull()){
throw runtime_error("Queue overflow!!!");
}
Node<Type>* newNode = new Node<Type>(key);
if(isEmpty()){
front = rear = newNode;
}
else{
rear->next = newNode;
rear = newNode;
}
length++;
}
/// delete (dequeue)
void dequeue(){
if(isEmpty()){
throw runtime_error("Queue underflow!!!");
}
Node<Type>* temp = front;
front = front->next;
delete temp;
length--;
if(front == nullptr){ // if queue becomes empty
rear = nullptr;
}
}
/// destructor
~Queue(){
while(!isEmpty()){
dequeue();
}
}
};
int main()
{
Queue<char> q1;
q1.enqueue('a');
q1.enqueue('b');
q1.enqueue('c');
cout << "Length: " << q1.getLength()
<< " Front: " << q1.getFront()
<< " Rear: " << q1.getRear() << endl;
q1.dequeue();
cout << "After Dequeue -> Front: " << q1.getFront() << endl;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgpjbGFzcyBOb2RlewpwdWJsaWM6CiAgICBUeXBlIGRhdGE7CiAgICBOb2RlPFR5cGU+KiBuZXh0OwoKICAgIC8vIENvbnN0cnVjdG9yCiAgICBOb2RlKGNvbnN0IFR5cGUmIHZhbHVlKXsKICAgICAgICB0aGlzLT5kYXRhID0gdmFsdWU7CiAgICAgICAgdGhpcy0+bmV4dCA9IG51bGxwdHI7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KY2xhc3MgUXVldWV7CnByaXZhdGU6CiAgICBOb2RlPFR5cGU+KiBmcm9udDsKICAgIE5vZGU8VHlwZT4qIHJlYXI7CiAgICBpbnQgbWF4U2l6ZSwgbGVuZ3RoOwoKcHVibGljOgogICAgUXVldWUoKXsKICAgICAgICBmcm9udCA9IG51bGxwdHI7CiAgICAgICAgcmVhciA9IG51bGxwdHI7CiAgICAgICAgbGVuZ3RoID0gMDsKICAgICAgICBtYXhTaXplID0gMTAwMDA7CiAgICB9CgogICAgLy8vIGNoZWNrIGlmIHF1ZXVlIGlzIGZ1bGwKICAgIGJvb2wgaXNGdWxsKCl7CiAgICAgICAgaWYobGVuZ3RoID09IG1heFNpemUpCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vLyBjaGVjayBpZiBxdWV1ZSBpcyBlbXB0eQogICAgYm9vbCBpc0VtcHR5KCl7CiAgICAgICAgaWYobGVuZ3RoID09IDApCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vLyBnZXQgZnJvbnQgZWxlbWVudAogICAgVHlwZSBnZXRGcm9udCgpewogICAgICAgIGlmKGlzRW1wdHkoKSl7CiAgICAgICAgICAgIHRocm93IHJ1bnRpbWVfZXJyb3IoIlF1ZXVlIGlzIGVtcHR5Iik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmcm9udC0+ZGF0YTsKICAgIH0KCiAgICAvLy8gZ2V0IHJlYXIgZWxlbWVudAogICAgVHlwZSBnZXRSZWFyKCl7CiAgICAgICAgaWYoaXNFbXB0eSgpKXsKICAgICAgICAgICAgdGhyb3cgcnVudGltZV9lcnJvcigiUXVldWUgaXMgZW1wdHkiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlYXItPmRhdGE7CiAgICB9CgogICAgLy8vIGdldCBsZW5ndGgKICAgIGludCBnZXRMZW5ndGgoKXsKICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgfQoKICAgIC8vLyBpbnNlcnQgKGVucXVldWUpCiAgICB2b2lkIGVucXVldWUoVHlwZSBrZXkpewogICAgICAgIGlmKGlzRnVsbCgpKXsKICAgICAgICAgICAgdGhyb3cgcnVudGltZV9lcnJvcigiUXVldWUgb3ZlcmZsb3chISEiKTsKICAgICAgICB9CgogICAgICAgIE5vZGU8VHlwZT4qIG5ld05vZGUgPSBuZXcgTm9kZTxUeXBlPihrZXkpOwoKICAgICAgICBpZihpc0VtcHR5KCkpewogICAgICAgICAgICBmcm9udCA9IHJlYXIgPSBuZXdOb2RlOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICByZWFyLT5uZXh0ID0gbmV3Tm9kZTsKICAgICAgICAgICAgcmVhciA9IG5ld05vZGU7CiAgICAgICAgfQoKICAgICAgICBsZW5ndGgrKzsKICAgIH0KCiAgICAvLy8gZGVsZXRlIChkZXF1ZXVlKQogICAgdm9pZCBkZXF1ZXVlKCl7CiAgICAgICAgaWYoaXNFbXB0eSgpKXsKICAgICAgICAgICAgdGhyb3cgcnVudGltZV9lcnJvcigiUXVldWUgdW5kZXJmbG93ISEhIik7CiAgICAgICAgfQoKICAgICAgICBOb2RlPFR5cGU+KiB0ZW1wID0gZnJvbnQ7CiAgICAgICAgZnJvbnQgPSBmcm9udC0+bmV4dDsKICAgICAgICBkZWxldGUgdGVtcDsKICAgICAgICBsZW5ndGgtLTsKCiAgICAgICAgaWYoZnJvbnQgPT0gbnVsbHB0cil7ICAgLy8gaWYgcXVldWUgYmVjb21lcyBlbXB0eQogICAgICAgICAgICByZWFyID0gbnVsbHB0cjsKICAgICAgICB9CiAgICB9CgogICAgLy8vIGRlc3RydWN0b3IKICAgIH5RdWV1ZSgpewogICAgICAgIHdoaWxlKCFpc0VtcHR5KCkpewogICAgICAgICAgICBkZXF1ZXVlKCk7CiAgICAgICAgfQogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBRdWV1ZTxjaGFyPiBxMTsKCiAgICBxMS5lbnF1ZXVlKCdhJyk7CiAgICBxMS5lbnF1ZXVlKCdiJyk7CiAgICBxMS5lbnF1ZXVlKCdjJyk7CgogICAgY291dCA8PCAiTGVuZ3RoOiAiIDw8IHExLmdldExlbmd0aCgpCiAgICAgICAgIDw8ICIgRnJvbnQ6ICIgPDwgcTEuZ2V0RnJvbnQoKQogICAgICAgICA8PCAiIFJlYXI6ICIgPDwgcTEuZ2V0UmVhcigpIDw8IGVuZGw7CgogICAgcTEuZGVxdWV1ZSgpOwoKICAgIGNvdXQgPDwgIkFmdGVyIERlcXVldWUgLT4gRnJvbnQ6ICIgPDwgcTEuZ2V0RnJvbnQoKSA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9