数据结构(顺序表)- 队列

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值