#include <iostream>
#include <string>

// Book class
class Book {
public:
	std::string title;
	std::string author;
	std::string genre;

	Book(std::string title, std::string author, std::string genre) {
		this->title = title;
		this->author = author;
		this->genre = genre;
	}
};

// Linked list node class
class Node {
public:
	Book data;
	Node* next;

	Node(Book data) {
		this->data = data;
		this->next = nullptr;
	}
};

// Linked list class
class LinkedList {
public:
	Node* head;

	LinkedList() {
		head = nullptr;
	}

	void add(Book data) {
		Node* newNode = new Node(data);
		if (head == nullptr) {
			head = newNode;
		} else {
			Node* current = head;
			while (current->next) {
				current = current->next;
			}
			current->next = newNode;
		}
	}

	Book search(std::string title) {
		Node* current = head;
		while (current) {
			if (current->data.title == title) {
				return current->data;
			}
			current = current->next;
		}
		return Book("", "", "");
	}
};

// Stack class
class Stack {
public:
	Book* items;
	int top;

	Stack() {
		items = new Book[10];
		top = -1;
	}

	void push(Book item) {
		items[++top] = item;
	}

	Book pop() {
		return items[top--];
	}

	bool isEmpty() {
		return top == -1;
	}
};

// Queue class
class Queue {
public:
	Book* items;
	int front;
	int rear;

	Queue() {
		items = new Book[10];
		front = rear = 0;
	}

	void enqueue(Book item) {
		items[rear++] = item;
	}

	Book dequeue() {
		return items[front++];
	}

	bool isEmpty() {
		return front == rear;
	}
};

// Library class
class Library {
public:
	LinkedList books;
	LinkedList borrowers;
	Stack loans;
	Queue reservations;

	void addBook(std::string title, std::string author, std::string genre) {
		Book newBook(title, author, genre);
		books.add(newBook);
	}

	void borrowBook(std::string title) {
		Book book = books.search(title);
		if (book.title != "") {
			loans.push(book);
			std::cout << title << " borrowed successfully!" << std::endl;
		}
	}

	void returnBook() {
		if (!loans.isEmpty()) {
			Book book = loans.pop();
			std::cout << book.title << " returned successfully!" << std::endl;
		}
	}

	void reserveBook(std::string title) {
		reservations.enqueue(Book(title, "", ""));
		std::cout << title << " reserved successfully!" << std::endl;
	}

	void displayBooks() {
		Node* current = books.head;
		while (current) {
			std::cout << current->data.title << std::endl;
			current = current->next;
		}
	}
};

int main() {
	Library library;

	while (true) {
		std::cout << "1. Add book" << std::endl;
		std::cout << "2. Borrow book" << std::endl;
		std::cout << "3. Return book" << std::endl;
		std::cout << "4. Reserve book" << std::endl;
		std::cout << "5. Display books" << std::endl;
		std::cout << "6. Exit" << std::endl;
		int choice;
		std::cin >> choice;

		switch (choice) {
		case 1: {
			std::string title, author, genre;
			std::cout << "Enter book title: ";
			std::cin >> title;
			std::cout << "Enter book author: ";
			std::cin >> author;
			std::cout << "Enter book genre: ";
			std::cin >> genre;
			library.addBook(title, author, genre);
			break;
		}
		case 2: {
			std::string title;
			std::cout << "Enter book title to borrow: ";
			std::cin >> title;
			library.borrowBook(title);
			break;
		}
		case 3: {
			library.returnBook();
			break;
		}
		case 4: {
			std::string title;
			std::cout << "Enter book title to reserve: ";
			std::cin >> title;
			library.reserveBook(title);
			break;
		}
		case 5: {