解密QQ号——队列

A给B加密过的一串数是“6 3 1 7 5 8 9 2 4”,并且告诉B解密规则。规则:首先将第一个数删除,接着将第二个数放到这串数的末尾,再将第三个数删除并将第四个数放到这串数的末尾,再将第五个数删除…直到剩下最后一个数,将最后一个数也删除。把删除的数连在一起就是A的QQ号。

首先需要一个数组来存储这一串数即int q[101],并初始化这个数组即int q[101] = {0,6,3,1,7,5,8,9,2,4}(此处初始化多写了一个0,用来填充q[0],因为喜欢从q[1]开始用)

解密的第一步是将第一个数删除。最简单的方法是将所有后面的数都往前面挪动一位,将前面的数覆盖,但是这样做很耗费时间。
0 6 3 1 7 5 8 9 2 4
q[0] q[1] q[2] q[3] q[4] q[5] q[6] q[7] q[8] q[9] q[10]
删除队列第一个数,并将后面所有的数向前挪动一位:
0 3 1 7 5 8 9 2 4
q[0] q[1] q[2] q[3] q[4] q[5] q[6] q[7] q[8] q[9] q[10]

引入两个整型变量head和tail。head用来记录队列的队首(即第一位),tail用来记录队列的队尾(即最后一位的下一个位置)。为什么这样?因为当队列中只剩下一个元素时,队首和队尾重合会带来一些麻烦。我们规定队首和队尾重合时,队列为空。

现在有九个数,九个数全部放入队列之后head = 1,tail = 10,此时head和tail之间的数就是目前队列中“有效”的数。如果要删除一个数的话,将Head++就好了。虽然浪费了一个空间,缺节省了大量的时间。如果要新增加一个数,把需要增加的数放在队尾即q[tail]之后再tail++就好。

总结:在队首删除一个数的操作是head++;在队尾增加一个数(假设这个数是x)的操作是q[tail] = x;tail++;。

代码:

#include<stdio.h>
int main() {
int q[102] = {0,6,3,1,7,5,8,9,2,4},head,tail;
//初始化队列
head = 1;
tail = 10;/ /队列有9个元素,tail指向队尾的后一个位置
while(head < tail) { //当队列不为空的时候执行循环
//打印队首,并将队首 出队
printf("%d",q[head]);
head++;
//将新队首的数添加到队尾
q[tail] = q[head];
tail++;
//再将队首出队
head++;
}
getchar();getchar();
return 0;
}

队列是一种特殊的线性结构,只允许在队列的首部(head)进行删除操作,这成为“出队”,而在队列的尾部(tail)进行插入操作,这称为“入队”。当队列中没有元素时(即head == tail),称为空队列。
队列是学习广度优先搜索以及队列优化的Bellman-Ford最短路算法的核心数据结构。

使用结构体来实现队列操作:

#include<stdio.h>
struct queue  {
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
};
int main() {
struct  queue q;
int i;
//初始化队列
q.head = 1;
q.tail = 1;
for(i = 1;i<=9;i++) {
//依次向队列插入9个数
scanf("%d",&q.data[q.tail]);
q.tail++;//保证在最后一位数字后一位
}
while(q.head<q.tail)//当队列不为空的时候执行循环
{
//打印队首并将队首出队
printf("%d",q.data[q.head]);
q.head++;
//先将新队首的数添加到队尾
q.data[q.tail] = q.data[q.head];
q.tail++;
//再将队首出队
q.head++;
}
getchar();getchar();
return 0 ;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值