循环队列:队列有着先入先出的特性。但是对于队列如果删除队头以后剩下的空间将不会被释放,又由于队列只能由队尾插入这就导致
被删除部分的空间被浪费。解决这个问题就是循环队列。循环队列顾名思义就是将队列串起来形成一个类似与环的结构。如图所示。对照着图很容易理解:
对于原来队列里的操作自然有不同的地方:
1.判断满:循环队列的满不再是rear=front 而是改成(rear-front+maxn)%maxn。
2.入队操作: data[rear] = x; rear = (rear+1)%maxn;
被删除部分的空间被浪费。解决这个问题就是循环队列。循环队列顾名思义就是将队列串起来形成一个类似与环的结构。如图所示。对照着图很容易理解:
对于原来队列里的操作自然有不同的地方:
1.判断满:循环队列的满不再是rear=front 而是改成(rear-front+maxn)%maxn。
2.入队操作: data[rear] = x; rear = (rear+1)%maxn;
总体思想就是不让rear和front的值超过maxn的大小。于是就在rear和front自增时候模maxn。
#include <iostream>
using namespace std;
const int maxn = 100;
template <class T>
class enqueue
{
public:
enqueue();
bool empty();
bool full();
void push_elem(T x);
void pop_elem();
T get_front();
int get_len();
void showenqueue();
~enqueue();
private:
T *data;
int rear;
int front;
int length;
};
template <class T>
enqueue<T>::enqueue()
{
rear = 0;
front = 0;
data = new T[maxn];
length = maxn;
}
template <class T>
enqueue<T>::~enqueue()
{
delete []data;
}
template <class T>
int enqueue<T>::get_len()
{
return (rear-front+length)%length;
}
template <class T>
bool enqueue<T>::empty()
{
if (front == rear)
return true;
else
return false;
}
template <class T>
bool enqueue<T>::full()
{
if ((rear+1)%length == front)
return true;
else
return false;
}
template <class T>
void enqueue<T>::push_elem(T x)
{
if (!full())
{
data[rear] = x;
rear = (rear+1)%length;
}
else
{
cout << "queue is full" << endl;
}
}
template <class T>
void enqueue<T>::pop_elem()
{
if (!empty())
front = (front+1)%length;
else
cout << "queue is empty" << endl;
}
template <class T>
T enqueue<T>::get_front()
{
if (!empty())
return data[front];
else
cout << "queue is full" << endl;
}
template <class T>
void enqueue<T>::showenqueue()
{
int cnt = front;
if (front > rear)
rear += length;
while (cnt <= rear-1)
{
cout << data[cnt] << " ";
cnt++;
}
cout << endl;
}
int main ()
{
enqueue<int>q;
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
q.push_elem(i+1);
}
q.showenqueue();
cout << q.get_front() << endl;
cout << q.get_len() << endl;
q.pop_elem();
q.pop_elem();
q.push_elem(7);
q.push_elem(6);
q.showenqueue();
cout << q.get_len() << endl;
q.~enqueue();
system("pause");
return 0;
}