使用队列实现杨辉三角
2017-10-17 07:04
239 查看
使用队列实现杨辉三角
杨辉三角的特点:
除了第一行,其他行两端都为1;
从第三行开始可以看出,除了两端,其中每个数都是元素本身上面对着的两个数的和;
奇数行有奇数个数,偶数行有偶数个数,都是n个数
每行数从左端开始看到中间都是升序,都是正序。
想要用代码来实现杨辉三角最简单的方法就是使用两个数组来实现,互相承载结果,并将数组打印出来。但结合杨辉三角的特点,正序可以想到用队列的问题来解决。
解决方案:
可以想到,作为开端的1可以看成是0和1的和,因此开始可以将队列设成这样(此处是以3行为例子)
设定变量a和b来作为队列第一个元素和第二个元素的载体。在a获取了第一个元素后将第一个元素移出队列,然后让b获取新的第一个元素,然后将a和b加起来,并将结果移进队列中,并将结果打印出来
然后重复上述步骤,可以得到:
要能够获取第二行的值,我在第一行中进行两次和运算即可,第一轮到此也就可以停止了。
然后,让一个0入列,再次重复上面的步骤,具体流程大概是这样:
遇到的问题:
最初的原代码:
package ch15; import java.util.Scanner; /** * Created by Funny_One on 2017/10/13. */ public class YangHuiTriangle { public static void main(String[] args) { CircularArrayQueue<Integer> queue = new CircularArrayQueue(); Scanner sca = new Scanner(System.in); System.out.println("需要显示的行数:"); int n = sca.nextInt(); queue.enqueue(0); queue.enqueue(1); System.out.println(1); for(int times =0;times<n;times++){ queue.enqueue(0); for(int i=1;i<queue.size()-1;i++){ int a,b=0,c; if(queue.size()==1){ a = b; b = queue.first(); c = a + b; queue.enqueue(c); System.out.print(c); }else { a=queue.first(); queue.dequeue(); b = queue.first(); queue.dequeue(); c = a+b; queue.enqueue(c); System.out.print(c+" "); } } System.out.println(); } } }
运行的结果是:
可以见到,其中出现的问题有:
问题1:每一行只有一个元素;
问题2:每个元素都是1;
问题3: 不只有三行;
在我进行调试之后,发现这些问题的原因是:
问题1的原因:在我的代码中,当a和b将数据获取之后,一个1入列,1被打印出来,同时两个数被移出队列。此时的queue.size()= 2而i从1也变成2了,所以该循环结束,下面的也是如此的情况,因此一行就只有一个元素
问题2的原因:在第一轮之后,队列中只有两个数:0和1,因此做和运算后便只有打印1出来。
问题3的原因:因为最初先加了一行1,后面的关于times的循环有三次,因此会有四行出现。
修改后:
for(int times =0;times<n;times++){ queue.enqueue(0); int viceTimes = queue.size()-1; for(int m =n-times; m>=0;m--){ System.out.print(" "); } for(int i=1;i<=viceTimes;i++){ int a,b=0,c; a=queue.first(); queue.dequeue(); b = queue.first(); c = a+b; queue.enqueue(c); System.out.print(c+" "); } System.out.println(); }
用一个变量viceTimes来承载进行和运算的次数,并且该值固定不变。这样就能解决问题了。
相关文章推荐
- 使用队列循环实现杨辉三角
- 使用微软消息队列实现C#进程间通信
- 使用微软消息队列实现C#进程间通信(二)
- 使用微软消息队列实现C#进程间通信(三)
- C语言使用数组实现简单队列
- IPC之 - 使用微软消息队列实现C#进程间通信
- 使用微软消息队列实现C#进程间通信
- C#基础之温习--使用列表和链表实现优一个先级队列
- 使用单链表实现链队列
- 杨辉三角之c++队列实现
- 循环队列实现杨辉三角
- 使用两个队列实现一个栈,使用两个栈实现一个队列!
- linxu中使用completion实现等待队列
- 用队列实现杨辉三角
- 使用微软消息队列实现C#进程间通信
- 使用微软消息队列实现C#进程间通信(转)
- 最小优先级队列 — 使用最小堆实现
- 使用微软消息队列实现C#进程间通信
- C#_使用微软消息队列实现C#进程间通信
- 使用微软消息队列实现C#进程间通信