《啊哈,算法》的第2章-----队列
这一章通过一个qq号解密的例子引出了队列,并通过代码实现了解密过程。本文主要讲解qq号这个例子并用c语言实现
关于队列的讲解可以查看博客:https://blog.csdn.net/zhongguozhichuang/article/details/53196415
------------------------------------------------------------------------------------------------------------------------
问题描述:现在给一串数字,例如6 3 1 7 5 8 9 2 4,按照以下规则转换得到相应的序列,并输出
具体规则为:首先将第1 个数删除,紧接着将第2 个数放到这串数的末尾,再将第3 个数删除并将第4 个数放到这串数的末尾,再将第5 个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起,输出就是转换后的序列。
以上述为例:刚开始这串数是“6 3 1 7 5 8 9 2 4”,首先删除6 并将3 放到这串数的末尾,这串数更新为“1 7 5 8 9 2 4 3”。接下来删除1 并将7 放到末尾,即更新为“5 8 9 2 4 3 7”。再删除5 并将8 放到末尾即“9 2 4 3 7 8”,删除9 并将2 放到末尾即“4 3 7 8 2”,删除4 并将3 放到末尾即“7 8 2 3”,删除7 并将8 放到末尾即“2 3 8”,删除2 并将3 放到末尾即“8 3”,删除8 并将3 放到末尾即“3”,最后删除3。因此被删除的顺序是“6 1 5 9 4 7 2 8 3”
在不使用队列的时 具体代码如下:
#include<stdio.h> #define N 101 /*
* brief:解密qq号
* example:
* input: 6 3 1 7 5 8 9 2 4
* output:6 1 5 9 4 7 2 8 3
*/ int main() { int qq[N]={0}; int head,tail,i=1,len=0; printf("请输入您的qq号:"); do { scanf("%d",&qq[i++]); len++; }while(getchar()!=' '); head = 1; // 指向队头 即 第一个元素 tail = len+1; // 指向队尾的下一个元素 while(head < tail) { // 第一个元素删除 即 出队 printf("%d ",qq[head]); head ++; // 队头右移 qq[tail++] = qq[head]; // 将head指向的元素放在队尾 并且使tail向后移动一位 head ++; // 队头再次右移一位 , 完成一次循环操作 } return 0; }
上面的这个例子根据队列的思想借用静态数组模拟进队出队操作,以下再看看采用结构体--队列,实现的代码吧
#include<stdio.h> #define N 101 // 采用队列解密 typedef struct queue{ int data[N]; int head; int tail; }Queue; int main() { Queue q; int i; // 初始化队列 q.head = 1; q.tail = 1; for(i=1;i<10;++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++; } return 0; }
当然。,队列不仅仅可以采用数组存储也可以采用链表(数据结构这本书里有详细的介绍,可以查阅相关书籍)。本文仅仅是为了学习队列写的上述代码,难免显的没第一个简洁。以后在做相关练习时,适合自己的风格就行,哪好用用哪个。有什么疑问,欢迎拍砖