zoukankan      html  css  js  c++  java
  • 啊哈!算法:解密QQ号

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

     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
    ", 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 }
  • 相关阅读:
    2017.10.20
    2017.10.14
    2017.10.19
    2017.10.18
    2017.10.17
    软件工程个人作业02
    构建之法读后感03
    构建之法阅读笔记02
    二柱子问题(随机产生四则运算题目)
    课后作业2(构建之法阅读计划)
  • 原文地址:https://www.cnblogs.com/xiaomanon/p/4466157.html
Copyright © 2011-2022 走看看