From f5ac08ce9e74b27c9bb0aab2f9144c92009db7c0 Mon Sep 17 00:00:00 2001
From: chavi362 <140444217+chavi362@users.noreply.github.com>
Date: Sun, 22 Oct 2023 01:55:51 +0300
Subject: [PATCH] add Implementation of a queue by a binary file

---
 .../Queue-Implementation-by-a-binary-file.cpp | 114 ++++++++++++++++++
 1 file changed, 114 insertions(+)
 create mode 100644 Queue-Implementation/Queue-Implementation-by-a-binary-file.cpp

diff --git a/Queue-Implementation/Queue-Implementation-by-a-binary-file.cpp b/Queue-Implementation/Queue-Implementation-by-a-binary-file.cpp
new file mode 100644
index 0000000..a560063
--- /dev/null
+++ b/Queue-Implementation/Queue-Implementation-by-a-binary-file.cpp
@@ -0,0 +1,114 @@
+#include <iostream>
+#include <string>
+#include <fstream>
+using namespace std;
+template <class T>
+class MyQueue
+{
+public:
+	// protocol for MyQueue operations
+	virtual void clear() = 0;
+	virtual T dequeue() = 0;
+	virtual void enqueue(T value) = 0;
+	virtual T front() = 0;
+	virtual bool isEmpty() = 0;
+	virtual ~MyQueue() {}
+};
+template <class T>
+class QueueFile :public MyQueue<T>
+{
+	int queueSize = 10;
+	int indexOfFirst = 0;
+	int indexOfLast = 0;
+	fstream data;
+	bool isFull()
+	{
+		return indexOfFirst == indexOfLast + 1;
+	}
+public:
+	QueueFile(int size = 100) :queueSize(size)
+	{
+		data.open("queue.dat", ios::out);
+		T stam;
+		for (int i = 0; i < size; i++)
+		{
+			data.write((char*)&stam, sizeof(T));
+		}
+		data.close();
+		data.open("queue.dat", ios::out | ios::in);
+		if (!data)
+			throw "error in opening";
+	}
+	void clear()
+	{
+		indexOfFirst = 0;
+		indexOfLast = 0;
+	}
+	bool isEmpty()
+	{
+		return indexOfFirst == indexOfLast;
+	}
+	T front()
+	{
+		if (this->isEmpty())
+			throw "underflow";
+		data.seekg(indexOfFirst * sizeof(T), ios::beg);
+		T s;
+		data.read((char*)&s, sizeof(T));
+		return s;
+	}
+	T dequeue()
+	{
+		if (this->isEmpty())
+			throw "underflow";
+		data.seekg(indexOfFirst * sizeof(T), ios::beg);
+		T s;
+		data.read((char*)&s, sizeof(T));
+		if (indexOfFirst == queueSize)
+			indexOfFirst = 0;
+		else
+			indexOfFirst++;
+		return s;
+	}
+	void enqueue(T value) {
+		if (this->isFull())
+			throw "overflow";
+		data.seekp(indexOfLast * sizeof(T), ios::beg);
+		data.write((char*)&value, sizeof(value));
+		if (indexOfLast == queueSize)
+			indexOfLast = 0;
+		else
+			indexOfLast++;
+	}
+	~QueueFile()
+	{
+		data.close();
+	}
+};
+	int main() {
+		try {
+			QueueFile<int> queue(5);
+			queue.enqueue(1);
+			queue.enqueue(2);
+			queue.enqueue(3);
+			cout << queue.dequeue() << endl; // 1
+			cout << queue.dequeue() << endl; 
+			queue.enqueue(4);
+			queue.enqueue(5);
+			cout << queue.front() << endl; //  3
+			// Clear the queue
+			queue.clear();
+			if (queue.isEmpty())
+				cout << "Queue is empty" << endl; 
+			queue.enqueue(4);
+			queue.enqueue(5);
+			cout << queue.front() << endl; 
+			cout << queue.dequeue() << endl; 
+			cout << queue.dequeue() << endl;
+			cout << queue.dequeue() << endl;
+		}
+		catch (const char* error) {
+			cout << error << endl;
+		}
+		return 0;
+	}
\ No newline at end of file