新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问 QQ 号, 小哈当然不会直接告诉小哼啦,原因嘛你懂的。所以小哈给了小哼一串加密过的数字,同时 小哈也告诉了小哼解密规则。规则是这样的:首先将第 1 个数删除,紧接着将第 2 个数放到 这串数的末尾,再将第 3 个数删除并将第 4 个数放到这串数的末尾,再将第 5 个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一 起就是小哈的 QQ 啦。现在你来帮帮小哼吧。小哈给小哼加密过的一串数是“6 3 1 7 5 8 9 2 4”。
/*
我们来小结一下,在队首删除一个数的操作是 head++;。
在队尾增加一个数(假设这个数是 x)的操作是 q[tail]=x;tail++;。
*/
#include<iostream>
using namespace std;
int main()
{
int s[20]={0,6,3,1,7,5,8,9,2,4};//将一维数组当做队列 ,用0填充s[0],习惯从是[1]开始操作
int head,tail;
head=1;//head 用来记录队列的队首(即第一位)
tail=10;//tail 用来记录队列的队尾(即最后一位)的下一个位置
/*为什么 tail 不直接记 录队尾,却要记录队尾的下一个位置呢?这是因为当队列中只剩下一个元素时,队首和队尾重合会带来一些麻烦。
我们这里规定队首和队尾重合时,队列为空。
*/
while(head<tail)
{
cout<<s[head]<<" ";//打印队首
head++;//从队首删除一个元素
s[tail]=s[head];//将新队首的数添加到队尾
tail++;
head++;
}
return 0;
}
将队列封装成结构体实现的方法:
#include<iostream>
using namespace std;
typedef struct queue
{
int s[20];//用来存储队列中的数据内容
int head;//只向队首
int tail;// 只向队尾的下一个位置
}queue;
int main()
{
queue q;
q.head=1;
q.tail=1;
//向队列中插入原始数据
for(int i=1;i<10;i++)
{
cin>>q.s[q.tail];
q.tail++;
}
while(q.head<q.tail)//当队列不为空的时候执行循环
{
cout<<q.s[q.head]<<" ";
q.head++;
q.s[q.tail]=q.s[q.head];
q.tail++;
q.head++;
}
return 0;
}