队列 总结
首先是一道题,简单的算法题
解密QQ号
每次从前面拿两个,第 1 个扔掉,第 2 个 放到尾部。循环
解密的第一步是将第一个数删除,简单的方法是将所有后面的数都往前面挪动一位,将前面的数覆盖。然后让最后一个位置的值变成移到尾部的数值,循环
实现的代码,如下
#include <stdio.h>
main(){
int a[10],t,m;
for(int i=0;i<10;i++){
scanf("%d",&a[i]);
}
//从左到右,每两位分为一组
for(int j=1;j<8;j++){
t = a[j];//拿出每组第二个数
for(m=j+1;m<10;m++){//放到末尾,并且数组左移
a[m-1] = a[m];
}
a[m] = t;//让最后一个位置的值为
//可以看一下中间数据的变化,我感觉比调试好一点
//printf("\n");
//for(int n=0;n<10;n++){
//printf("%d ",a[n]);
//提供一组数据 1261667125
}
}
printf("\n");
for(int n=0;n<10;n++){
printf("%d ",a[n]);
}
}
但是上面的算法比较费时间,下面使用head tail来记录队列的队首和队尾的下一个位置。至于为什么tail记录队尾的下一个位置时,是因为如果只有一个元素时,对首和对尾相同,不好使用while跳出循环。
#include <stdio.h>
int main() {
//该算法就是把前面空间的要移的数移到后面的多出来的空间
//浪费了内存,但是节省了时间
int q[22],head,tail,i;
for(int i=0;i<10;i++){
scanf("%d",&q[i]);
}
head=0;
tail=10; //队列中已经有10个元素了,tail指向队尾的后一个位置
while(head<tail){ //当队列不为空的时候执行循环
printf("%d ",q[head]);//打印队首并将队首出队
head++;
q[tail]=q[head];//先将新队首的数添加到队尾
tail++;
//再将队首出队
head++;
}
//我感觉while中的语句结合数据会好理解一点
return 0;
}
-
队列是一种特殊的线性结构,它只允许在队列的首部(head)进行删除操作,这称为“出队”,而在队列 的尾部(tail)进行插入操作,这称为“入队”。当队列中没有元素时(即 head==tail),称为 空队列。
- 队列将是我们今后学习广度优先搜索以及队列优化的 Bellman-Ford 短路算法的核心 数据结构。所以现在将队列的三个基本元素(一个数组,两个变量)封装为一个结构体类型, 如下。
#include <stdio.h>
struct queue {
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
};
int main() {
struct queue q;
int i;
q.head=1;
q.tail=1;
for(i=1;i<=9;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;
}
学习算法,如果有像我这样的小白,推荐可以看《啊哈 !算法》
2020/3/24/19/50