《啊哈!算法》学习笔记——队列

队列是一种特殊的线性结构。引入两个整型变量head和tail,head用来记录队列的队首(即第一位),tail用来记录队列的队尾(即最后一位)的下一个位置。(原因:队列只剩一个元素时,队首和队尾重合会带来一些麻烦)我们规定队首和队尾重合时,队列为空

它只允许在队列的首部(head)进行删除操作,这称为“出队”,而在队列的尾部tail进行插入操作,这称为“入队”。当队列没有元素时(即head==tail),称为空队列。我们也称为“先进先出”(First In First Out,FIFO)原则。

在队首删除一个数的操作是head++;
在队尾增加一个数(x)的操作是q[tail]=x; tail++;

废话不多说,我们来看一道例题,具体学习一下队列的应用。

例题:

解密QQ号。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数再放到这串数的末尾,再将第5个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是真实的QQ啦。加密过的一串数是“6 3 1 7 5 8 9 2 4”。解密后的QQ号应该是“6 1 5 9 4 7 2 8 3”。

#include <stdio.h>
struct queue{
	int data[100000];
	int head;	//队首 
	int tail;	//队尾 
};
int main(){
	struct queue q;
	int n,i;
	//初始化队列 
	q.head=0;
	q.tail=0;
	scanf("%d",&n); 
	for(i=0;i<n;i++){
		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;
}

输入样例:

9
6 3 1 7 5 8 9 2 4

输出样例:

6 1 5 9 4 7 2 8 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值