20162311 队列加分项
20162311 队列加分项
作业目标
- 用实现循环队列
- 参考PPT用循环队列打印杨辉三角
- 用JDB或IDEA单步跟踪排队情况,画出队列变化图,包含自己的学号信息
- 把代码推送到代码托管平台
- 把完成过程写一篇博客:重点是单步跟踪过程和遇到的问题及解决过程
- 提交博客链接
具体步骤
一、用循环队列打印杨辉三角
打印杨辉三角这个作业,其实之前在学第十一章递归的时候,我就已经做过了,是一个课后的作业,只不过当时用的是数组
所以整体思路还是有的,只不过是把数组换成了队列。不同的地方在于,数组可以直接访问任意位置的元素,而队列不行。我先定义一个getQueue()方法,传入int类型的参数,代表第n行杨辉三角。
private static CircularArrayQueue<Integer> getQueue(int line){ CircularArrayQueue<Integer> queue = new CircularArrayQueue<>(); if(line == 1){ queue.enqueue(0); queue.enqueue(1); queue.enqueue(0); }else if(line > 1){ CircularArrayQueue<Integer> newQueue = getQueue(line-1); queue.enqueue(0); int arr[] = new int[newQueue.size()]; int times = newQueue.size(); for(int j=0;j<times;j++){ arr[j]=newQueue.dequeue(); } for(int i=0;i<arr.length-1;i++){ queue.enqueue(arr[i]+arr[i+1]); } queue.enqueue(0); } return queue; }
同样也用到了递归,用来获取上一行的数据。然后在再在主函数里调用这个方法,循环打印杨辉三角
public static void main(String[] args) { CircularArrayQueue<Integer> queue; Scanner scan = new Scanner(System.in); while(true){ System.out.println("请输入要打印的行数"); int line = scan.nextInt(); if(line>0){ for (int i=0;i<line;i++){ queue=getQueue(i+1); queue.dequeue(); int times = queue.size()-1; for(int j=0;j<times;j++){ System.out.print(queue.dequeue()+" "); } System.out.println(); } break; }else{ System.out.println("打印的行数必须大于零!"); continue; } }
二、单步跟踪过程和遇到的问题及解决过程
写好之后我先运行了一下,但是结果却出了问题
结果和预期的不一样,于是我设置断点进行调试
我在获取第n行元素时,用递归的方法先获取第n-1行元素,然后把他们放到一个数组中,方便后面计算。但这里循环有问题。这里j<newQueue.size(),本来是可以的,但是循环体里的语句有newQueue.dequeue(),而这条语句执行完,再次执行循环时,newQueue的size就发生改变了,所以循环的次数少了。于是我先用一个int类型变量把最初的newQueue.size()储存起来,这样就没问题了。