书中给出的算法有点浪费空间,可以使用循环队列进行改进,这样就不需要使用额外的空间,在原数组的基础上就可以完成解密,代码如下:
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 }
时间: 2024-10-06 03:06:27