`
java-mans
  • 浏览: 11436754 次
文章分类
社区版块
存档分类
最新评论

队列的简单应用-杨辉三角和约瑟夫环

 
阅读更多

接上一篇,由于队列的内容相对比较简单,所以这次举两个实际的问题—杨辉三角和约瑟夫环。(不知道这两个问题的童鞋可以自行百度。)

先看杨辉三角。使用队列解决这个问题有1个小的技巧:第一就是在两个1的两边增加两个0,通过0来标记这一层的结束。先看程序吧:

//遍历循环链表并打印
void printQueue(Queue *q)
{
	for(int i = 0; i < Qlength(q);++i)
		printf("%d ",q->data[(q->front+i+q->Qsize)%q->Qsize]);
	printf("\n");
}

//输出杨辉三角的第n行的元素
void YangHuiTriangle(int n)
{
	int level = n;
	//printf("请输入");
	Queue myQueue;
	initQueue(&myQueue,level);
	//初始化第一行:使用0作为一行结束的标记
	enQueue(&myQueue,0);
	enQueue(&myQueue,1);
	enQueue(&myQueue,1);
	enQueue(&myQueue,0);
	
	int x,y;
	for(int m = 1;m < level;++m)
	{
		do{
			//将整个队列的前两个求和放入队尾,并删除队首元素
			deQueue(&myQueue,&x);
			getHead(&myQueue,&y);
			enQueue(&myQueue,x+y);
		}while(y!=0);
		//填充队尾标记
		enQueue(&myQueue,0);
	}	
	printQueue(&myQueue);

}


这个做法很巧妙:先让元素出队,再获得后面的那个元素,然后再将二者相加以后入队,重复这个工作,直到遇见0为止。这个0既是上一层队列结束的0,又是这一层队列开始的0.

下面是约瑟夫环的程序:(我承认我写的很丑陋,但是貌似可以用)

//输入size-1个数,每隔interval个数将它去掉,输出最后的结果
void Josephus(int size,int interval)
{
	Queue JQueue;
	initQueue(&JQueue,size);
	//给原先的队列赋出值
	for(int l = 0; l < size-1; ++l)
	{
		enQueue(&JQueue,l);
	}
	//先打印赋值结果
	printQueue(&JQueue);
	int sum = size-1;
	//计数器:用来计算隔了多个数
	int counter = 0;
	int  i = 0;
	//每隔interval个数(包含这个数)去掉一个数,最后会剩下interval-1个数
	while(sum != interval-1)
	{

//		printf("i = %d\n",i);	
//		int j = i%(JQueue.Qsize-1);
//		int k = JQueue.data[(JQueue.front+i+JQueue.Qsize-1)%(JQueue.Qsize-1)];
//		printf("第%d个元素,值为%d\n",j,k);
		//如果这个元素之前已经被去掉过,那么跳过它
		if(JQueue.data[(JQueue.front+i+JQueue.Qsize-1)%(JQueue.Qsize-1)] == -1)
		{
			
			
//			printf("跳过第%d个元素\n",i%JQueue.Qsize);
				++i;
			continue;
		}
		if((counter+1)%interval == 0)
		{
			//如果需要被去掉,则标记为-1
			JQueue.data[(JQueue.front+i+JQueue.Qsize-1)%(JQueue.Qsize-1)] = -1;
//			printf("第%d个元素被置为-1\n",i%(JQueue.Qsize-1));
			--sum;
			counter = 0;
		}
		else
			++counter;
		++i;

	}
	for(int i = 0; i < Qlength(&JQueue);++i)
	{
		if(JQueue.data[JQueue.front+i] != -1)
			printf("%d ",JQueue.data[(JQueue.front+i+JQueue.Qsize)%JQueue.Qsize]);
	}
	printf("\n");
	destroyQueue(&JQueue);
	
}


可以通过打开调试语句来看到他是如何一步一步执行的。

这个问题貌似有更简单的解法,这里就不深入讨论了。

分享到:
评论

相关推荐

    数据结构 上机实验 耿国华 版

    老师布置的一些上机作业,自己参考教科书(耿国华版)完成的,多有不足,请勿见笑:实验1-多项式求和、实验2-顺序表LA和LB合并在LA、实验3(链表)-约瑟夫环、实验4(栈)-数制转换、实验5(队列)-杨辉三角、实验6-...

    数据结构与算法

    7.2.4 帕斯卡三角形(杨辉三角) 8 二叉树 8.1 基本概念 8.2 代码实现 8.3 说明 8.4 应用 9 二叉搜索树 9.1 基本概念 9.2 代码实现 9.3 说明 10 AVL树 10.1 基本概念 10.1.1 AVL树是什么? ...

    数据结构与算法(C\C++描述)

    7.2.4 帕斯卡三角形(杨辉三角) 8 二叉树 8.1 基本概念 8.2 代码实现 8.3 说明 8.4 应用 9 二叉搜索树 9.1 基本概念 9.2 代码实现 9.3 说明 10 AVL树 10.1 基本概念 10.1.1 AVL树是什么? 10.1.2 为...

    数据结构与算法分析学习笔记

    6 队列 6.1 基本概念 6.2 代码实现 6.3 应用 7 递归 7.1 基本概念 7.2 应用 7.2.1 阶乘 7.2.2 斐波那契数列 7.2.3 汉诺塔 7.2.4 帕斯卡三角形(杨辉三角) 8 二叉树 8.1 基本概念 8.2 代码实现 8.3 说明 8.4 应用 9 ...

    数据结构实验指导书

    实验4 杨辉三角显示 39 实验5四则运算表达式求值 40 实验6 BST 41 实验7 优先队列与堆 42 实验8 哈夫曼编/译码器 44 实验9 图的遍历问题 45 实验10 教学计划编制问题 47 实验11 最短路径问题 48 实验12 最小生成树...

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    4.15 打印杨辉三角 4.16 复杂级数的前n项和 4.17 寻找矩阵中的“鞍点” 4.18 n阶勒让德多项式求解 4.19 递归反向输出字符串 4.20 一年中的第几天 第5章 数学趣题(一) 5.1 舍罕王的失算 5.2 求两个数的最大公约数...

    C程序范例宝典(基础代码详解)

    实例017 打印杨辉三角 22 1.4 循环的数学应用 23 实例018 序列求和 23 实例019 简单的级数运算 24 实例020 用while语句求n! 25 实例021 特殊等式 26 实例022 求一个正整数的所有因子 27 实例023 ...

    c语言经典案例

    实例084 打印杨辉三角 108 实例085 求总数问题 109 实例086 彩球问题 110 实例087 新同学年龄 112 实例088 灯塔数量 113 实例089 计算12+22+…+102 114 实例090 循环显示随机数 115 实例091 卖西瓜 116 实例092 银行...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例150 C#实现杨辉三角算法 195 实例151 如何将B转换成GB、MB和KB 196 实例152 0~N位数的任意组合 197 实例153 在数组中快速查找近似值 199 实例154 猴子选大王算法的实现 200 实例155 使用MD5算法对密码进行加密 ...

Global site tag (gtag.js) - Google Analytics