1、插入只允许在表尾,删除只允许在表头一端进行,属于先进先出表
2、允许插入的为队尾,删除一端为队头
3、设置两个指针,一个头指针front指向队头,另一尾指针为rear
4、插入元素即rear加1,删除则front减1.front=rear表示队列内无任何元素
队列
利用队列的方式求解舞会问题,例5个男生和6个女生,依次配对,到尾则重头开始,依次组合列举出各种组合。
#include<bits/stdc++.h>
using namespace std;
const int MAXSIZE = 10000;
template<class T>
class cQueue
{ int m_head, m_tail, m_maxSize;//队头指针、尾指针和队列空间的最大尺寸
T *m_a;//存放队列元素的数组
public:
cQueue();
~cQueue();
bool push(const T& x);
T front();
void pop();
T dele();
int add(T &item);
bool isEmpty();
bool isFull();
int size();
void clear();
};
template<class T>
cQueue<T>::cQueue()
{
m_a = new T[MAXSIZE];//初始化定义大小和数组
m_maxSize = MAXSIZE;
m_head = m_tail = 0;//初状态头和尾均为零
}
template<class T>
cQueue<T>::~cQueue()
{
delete []m_a;
}
template<class T>
bool cQueue<T>::push(const T& x)//队列插入
{
if(isFull())
return 0;
m_a[m_tail++] = x;
return true;
}
template<class T>
T cQueue<T>::front()
{
if(m_head == m_tail)
return NULL;//读队列的头元素
return m_a[m_head];
}
template<class T>
void cQueue<T>::pop()
{
if(m_head < m_tail)
m_head++;
}
template<class T>
T cQueue<T>::dele()
{
//若队列不空,则删除队头元素,返回该元素值,否则返回NULL
if(!isEmpty())
{
T item = m_a[front];
front = (front + 1) % MAXSIZE;//该思想利用循环队列的方式,能够在头尾相连的队列中实现增加
return item;
}
else
return NULL;
}
template<class T>
int cQueue<T>::add(T &item)
{
if(!isFull())
{
m_a[m_tail] = item;
m_tail = (m_tail + 1) % MAXSIZE;
return 0;
}
else
{
return -1;
}
}
template<class T>
bool cQueue<T>::isEmpty()//判断是否为空
{
return (m_head == m_tail) ? true : false;
}
template<class T>
bool cQueue<T>::isFull()//判断是否为满
{
return (m_tail == m_maxSize) ? true : false;
}
template<class T>
int cQueue<T>::size()//计算队列的大小
{
return m_tail - m_head;
}
template<class T>
void cQueue<T>::clear()//清空队列
{
m_head = m_tail = 0;
}
int main()
{
cQueue<int> queM, queW;
int m, w, t;
cin>>m>>w>>t;
for(int i=1; i<=m; i++) queM.push(i);
for(int i=1; i<=w; i++) queW.push(i);
for(int i=1; i<=t; i++)
{
cout<<queM.front()<<" "<<queW.front()<<endl;
queM.push(queM.front()); queM.pop();
queW.push(queW.front()); queW.pop();
}
return 1;
}