1.实验内容
创建循环队列类,采用数组描述;实现卡片游戏,假设桌上有一叠扑克牌,依次编号为1-n(从最上面开始)。当至少还有两张的时候,可以进行操作:把第一张牌扔掉,然后把新的第一张放到整叠牌的最后。输入n,输出最后剩下的牌。
输入输出格式:
输入:
一个整数n,代表一开始卡片的总数。
输出:
最后一张卡片的值。
2.测试结果
输入:
100
输出:
72
3.实现源代码
#include<iostream>
using namespace std;
template<class T>
void changeLength(T *&a,int oldLength,int newLength) //改变数组的长度
{
T *temp=new T[newLength];
int number=min(oldLength,newLength);
copy(a,a+number,temp);
delete []a;
a=temp;
}
template<class T>
class arrayQueue //循环队列类
{
public:
arrayQueue(int initialCapacity=10) //构造函数
{
arrayLength=initialCapacity;
queue=new T[arrayLength];
queueFront=0;
queueBack=0;
}
~arrayQueue() //析构函数
{
delete []queue;
}
void pop() //删除队首元素
{
queueFront=(queueFront+1)%arrayLength;
queue[queueFront].~T();
}
void push(const T& theElement) //添加元素到队尾
{
if(queueFront==(queueBack+1)%arrayLength) //如果队列已满,扩充容量
{
changeLength(queue,arrayLength,2*arrayLength);
arrayLength*=2;
}
queueBack=(queueBack+1)%arrayLength;
queue[queueBack]=theElement;
}
T& front() //返回队首元素
{
return queue[(queueFront+1)%arrayLength];
}
T& back() //返回队尾元素
{
return queue[queueBack];
}
private:
int arrayLength; //数组容量
int queueFront; //队首下标
int queueBack; //队尾下标
T* queue; //队列元素数组
};
int main()
{
int n;
cin>>n; //输入初始牌数
arrayQueue<int> a(n); //创建队列对象
for(int i=0;i<n;i++) //添加初始的n张牌
a.push(i+1);
int temp;
for(int i=1;i<n-1;i++) //牌数不小于2时进行操作
{
a.pop();
temp=a.front();
a.pop();
a.push(temp);
}
cout<<a.back()<<endl; //输出最后剩余牌的序号
return 0;
}