码迷,mamicode.com
首页 > 编程语言 > 详细

啊哈!算法:解密QQ号

时间:2015-04-29 17:00:07      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

书中给出的算法有点浪费空间,可以使用循环队列进行改进,这样就不需要使用额外的空间,在原数组的基础上就可以完成解密,代码如下:

 1 #include <stdio.h>
 2 
 3 void decode(int a[], int size)
 4 {
 5     int head = 0, tail = size;//tail point to next position to be written
 6     
 7     while (head != tail){
 8         //删除队首元素
 9         printf("%2d ", a[head]);
10         head = (head + 1) % size;
11 
12         //将新的队首元素添加到队尾
13         a[tail % size] = a[head];
14         tail = (tail + 1) % size;//可以避免队列满时和队列空时状态相同的情况
15         //再将队首出队
16         head = (head + 1) % size;
17     }
18 }
19 
20 int main(void)
21 {
22     int a[100], size = 0, i;
23 
24     while (scanf("%d", &a[size]) != EOF){
25         ++size;
26     }
27 
28     printf("size : %d\n", size);
29 
30     decode(a, size);
31 
32     return 0;
33 }

代码中,head指向队首,而tail指向队尾的下一个位置,按照这种方式,如果执行删除操作后head==tail表示队列为空,如果执行插入操作后head==tail就表示队列满。按理说,tail在初始化时应该写成tail=0的,但是这样以开始判断就会导致while条件不成立,因此设置了tail=size,但这样做的代价就是讲新队首元素添加到队尾时下标总是要使用a[tail % size]。当然,我们也可以使用do-while结构来解决这个问题。

 1 void decode(int a[], int size)
 2 {
 3     int head = 0, tail = 0;//tail point to next position to be written
 4     
 5     do {
 6         //删除队首元素
 7         printf("%2d ", a[head]);
 8         head = (head + 1) % size;
 9 
10         //将新的队首元素添加到队尾
11         a[tail] = a[head];
12         tail = (tail + 1) % size;//可以避免队列满时和队列空时状态相同的情况
13         //再将队首出队
14         head = (head + 1) % size;
15     }while (head != tail);
16 }

 

啊哈!算法:解密QQ号

标签:

原文地址:http://www.cnblogs.com/xiaomanon/p/4466157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!