#include <bits/stdc++.h>
using
namespace
std;
template
<
class
X>
class
Deque {
private
:
int
frontIndex;
int
backIndex;
X* arr;
int
sizeVar;
int
capacityVar = 4;
public
:
Deque()
{
arr =
new
X[capacityVar];
frontIndex = backIndex = -1;
sizeVar = 0;
}
bool
empty();
bool
full();
void
push_back(X x);
void
push_front(X x);
void
pop_front();
void
pop_back();
X front();
X back();
int
capacity();
int
size();
};
template
<
class
X>
int
Deque<X>::capacity()
{
return
capacityVar;
}
template
<
class
X>
int
Deque<X>::size() {
return
sizeVar; }
template
<
class
X>
bool
Deque<X>::empty()
{
if
(frontIndex == -1 && backIndex == -1)
return
true
;
else
return
false
;
}
template
<
class
X>
bool
Deque<X>::full()
{
if
(sizeVar == capacityVar)
return
true
;
else
return
false
;
}
template
<
class
X>
X Deque<X>::front()
{
if
(empty()) {
cout <<
"Deque underflow"
<< endl;
abort
();
}
return
arr[frontIndex];
}
template
<
class
X>
X Deque<X>::back()
{
if
(empty()) {
cout <<
"Deque underflow"
<< endl;
abort
();
}
return
arr[backIndex];
}
template
<
class
X>
void
Deque<X>::push_back(X x)
{
if
(full()) {
capacityVar = capacityVar * 2;
X* temp =
new
X[capacityVar];
int
i = frontIndex;
int
j = 0;
while
(i != backIndex) {
temp[j] = arr[i];
i = (i + 1) % sizeVar;
j++;
}
temp[j] = arr[i];
frontIndex = 0;
backIndex = sizeVar - 1;
delete
[] arr;
arr = temp;
}
if
(empty()) {
frontIndex = backIndex = 0;
arr[backIndex] = x;
sizeVar++;
return
;
}
backIndex = (backIndex + 1) % capacityVar;
arr[backIndex] = x;
sizeVar++;
return
;
}
template
<
class
X>
void
Deque<X>::push_front(X x)
{
if
(full()) {
capacityVar = capacityVar * 2;
X* temp =
new
X[capacityVar];
int
i = frontIndex;
int
j = 0;
while
(i != backIndex) {
temp[j] = arr[i];
i = (i + 1) % sizeVar;
j++;
}
temp[j] = arr[i];
frontIndex = 0;
backIndex = sizeVar - 1;
delete
[] arr;
arr = temp;
}
if
(empty()) {
frontIndex = backIndex = 0;
arr[backIndex] = x;
sizeVar++;
return
;
}
frontIndex
= (frontIndex - 1 + capacityVar) % capacityVar;
arr[frontIndex] = x;
sizeVar++;
return
;
}
template
<
class
X>
void
Deque<X>::pop_front()
{
if
(empty()) {
cout <<
"Deque underflow"
<< endl;
abort
();
}
if
(frontIndex == backIndex) {
frontIndex = backIndex = -1;
sizeVar--;
return
;
}
frontIndex = (frontIndex + 1) % capacityVar;
sizeVar--;
return
;
}
template
<
class
X>
void
Deque<X>::pop_back()
{
if
(empty()) {
cout <<
"Deque underflow"
<< endl;
abort
();
}
if
(frontIndex == backIndex) {
frontIndex = backIndex = -1;
sizeVar--;
return
;
}
backIndex = (backIndex - 1 + capacityVar) % capacityVar;
sizeVar--;
return
;
}
int
main()
{
Deque<
int
> q;
for
(
int
i = 1; i < 10; i++)
if
(i % 2 == 0)
q.push_back(i);
else
q.push_front(i);
cout <<
"Current capacity "
<< q.capacity() << endl;
cout <<
"Current size "
<< q.size() << endl;
cout <<
"Front element "
<< q.front() << endl;
cout <<
"Rear element "
<< q.back() << endl;
cout << endl;
cout <<
"Pop an element from front"
<< endl;
q.pop_front();
cout <<
"Pop an element from back"
<< endl;
q.pop_back();
cout << endl;
cout <<
"Current capacity "
<< q.capacity() << endl;
cout <<
"Current size "
<< q.size() << endl;
cout <<
"Front element "
<< q.front() << endl;
cout <<
"Rear element "
<< q.back() << endl;
return
0;
}