算法初步——队列
新学期开始了,小孙是小单的新同桌(小单是个小美女哦),小孙向小单同学询问QQ号(邪魅一笑),小单怎么能这么容易将QQ号告诉小孙呢。所以小单给了小孙一串加密过后的数字并告诉小孙解密规则。规则如下:首先将第一个数删除,再将第二个数放在这串数字的末尾,将第三个数字删除,将第四个数字放在这串数字的末尾……以此类推,直至删除最后一个数字。接下来我们按照数字被删除的顺序将这些数字连在一起,就得到了小单的QQ。小单给小孙的加密数字串为“1 8 4 7 4 7 3 9 2 9”。
下面我们讲解解密过程:首先我们将队首的1删除并将第二个数字8放在队尾,此时我们的数字串可以更新为“4 7 4 7 3 9 2 9 8”;接下来我们将现在作为队首的4删除并将7放在数字串的末尾,该数串可更新为“4 7 3 9 2 9 8 7”;下面我们将此时的队首4删除并将7放在队尾,数字串更新为“3 9 2 9 8 7 7”;接着我们将3删除并将9放在数串末尾,数串更新为“2 9 8 7 7 9”;下面我们将2删除并将9放置在数串的末尾,将8删除将7放在数串末尾,将7删除并将9放在末尾,删除9并将7放在末尾,删除9,此时队列中只剩下一个数字7,将其删除。此时我们回头看看,我们依次删除了“1 4 4 3 2 8 7 9 9 7”,你们不妨加她试试看(^_^)。
讲到这里我相信大家已经可以完成编程过程了,好了我们下课。
虚晃一枪,我们继续。
#include<iostream> using namespace std; int main() { int q[102] = { 1,8,4,7,4,7,3,9,2,9 }, head, tail; //初始化队列 head = 0; tail = 10;//队列中已经有了10个数字,tail指向队尾的下一个位置 while (head < tail)//当队列不为空时执行循环 { //输出队首并将队首出队 cout << q[head] << " "; head++; //将新队首的数放到队尾 q[tail] = q[head]; tail++; //将新队首出队 head++; } cout << endl; return 0; }
怎么样,上面的代码有没有运行成功?现在我们来总结一下队列的概念。队列是一种特殊的线性结构,他只允许在队列的首部(head)进行删除操作,称为“出队”;在队列的尾部进行插入操作,称为“出队”。当队列中没有元素时(即head==tail),称为“空队列”。队列是一个非常有原则的人:它只允许“先进先出”,就像我们生活中的排队一样,谁先来排队谁就先走。
队列是我们以后将会学习的广度优先搜索以及队列优化的 Bellman-Ford最短路算法的核心数据结构。所以我们可以将队列的三个基本元素封装为一个结构体类型。
typedef struct queue { int data[101];//队列的主体,用来储存数据 int head;//队列的头 int tail;//队列的尾 };
下面我们就可以用结构体来实现队列操作了:
#include<iostream> using namespace std; typedef struct queue { int data[101];//队列的主体,用来储存数据 int head;//队列的头 int tail;//队列的尾 }; int main() { queue q; //初始化队列 q.head = 0; q.tail = 0; for (int i = 0; i < 10; i++) { //依次向队列插入10个数 cin >> q.data[q.tail]; q.tail++; } while (q.head < q.tail) { //输出队首并将队首出队 cout << q.data[q.head] << " "; q.head++; //将新队首的数放到队尾 q.data[q.tail] = q.data[q.head]; q.tail++; //再将队首出队 q.head++; } cout << endl; return 0; }
这样我们就完成了一个完整的队列操作,并获取了一位美女的QQ号。