#include<bits/stdc++.h>
#define MAX_SIZE 5
using namespace std;

class CircularQueue{
public:
    /** Initialize your data structure here. */
    int queue[MAX_SIZE];
	int fPtr, rPtr;
	int qsize;
	
    CircularQueue() {
        fPtr = rPtr = -1, qsize = 0;
    }
    
	bool push(int &val){
		if(isFull()){
			cout<<"Queue is full.\n";
			return false;
		}
		
		if(fPtr == -1){
			fPtr = rPtr = 0;
		}
		else{
			rPtr = (rPtr+1) % MAX_SIZE;	
		}
		
		queue[rPtr] = val;
		
		++qsize;
		
		return true;
	}
	
	int front(){
		return queue[fPtr];
	}
	
	int rear(){
		return queue[rPtr];
	}
	
	int size(){
		return qsize;
	}
	
	bool isEmpty(){
		return fPtr == -1 && rPtr == -1;
	}
	
	bool isFull(){
		return (rPtr+1) % MAX_SIZE == fPtr;
	}
	
	int pop(){
		
		if(isEmpty()){
			cout<<"Queue is empty.\n";
			return INT_MAX;
		}
		
		int retVal = queue[fPtr];
		
		if(rPtr == fPtr){
			rPtr = fPtr = -1;
		}
		else{
			fPtr = (fPtr+1) % MAX_SIZE;
		}
			
		--qsize;
		
		return retVal;
	}
	
	void print(){
		
		if(isEmpty()){
			cout<<"Queue is empty.\n";
			return;
		}
		
		for(int i = fPtr, qSize = size(); qSize-- > 0; i = (i+1) % MAX_SIZE){
			cout<<queue[i]<<(i ^ rPtr ? "->" : "");
		}
		
		cout<<"\n";
	}
};


int main() {
	
	int opt, val;
	
	CircularQueue cq;
	
	cout<<"Operations available on the circular queue:\n";
	cout<<"1. Push\n2. Pop\n3. Front\n4. Rear\n"
		  "5. Print from front to rear\n"
		  "6. Is queue empty\n7. Exit\n";
	
	while(true){
		cin>>opt;
		
		switch(opt){
			case 1:
				cin>>val;
				cout<<"Element "<<val<<" is "<<(cq.push(val) ? "":"not")<<" pushed into the queue.\n";
				break;
			case 2:
				val = cq.pop();
				if(val == INT_MAX)
					cout<<"Front element can't be popped from the queue.\n";
				else
					cout<<"Front element "<<val<<" popped from the queue.\n";
				break;
			case 3:
				cout<<"The front element in the queue is: "<<cq.front()<<"\n";
				break;
			case 4:
				cout<<"The rear element in the queue is: "<<cq.rear()<<"\n";
				break;
			case 5:
				cout<<"The elements in the queue from front to rear:\n"; 
				cq.print(); 
				break;
			case 6:
				cout<<"Queue is "<<(cq.isEmpty() ? "": "not")<<" empty.\n";
				break;
			case 7:
				exit(0);
		}
		cout<<"==========================================================\n";
	}
	
	return 0;
}