20162311 队列加分项

20162311 队列加分项

作业目标

  1. 用实现循环队列
  2. 参考PPT用循环队列打印杨辉三角
  3. 用JDB或IDEA单步跟踪排队情况,画出队列变化图,包含自己的学号信息
  4. 把代码推送到代码托管平台
  5. 把完成过程写一篇博客:重点是单步跟踪过程和遇到的问题及解决过程
  6. 提交博客链接

具体步骤

一、用循环队列打印杨辉三角

打印杨辉三角这个作业,其实之前在学第十一章递归的时候,我就已经做过了,是一个课后的作业,只不过当时用的是数组


所以整体思路还是有的,只不过是把数组换成了队列。不同的地方在于,数组可以直接访问任意位置的元素,而队列不行。我先定义一个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()储存起来,这样就没问题了。

队列变化图

代码托管

posted @ 2017-10-21 16:06  20162311张之睿  阅读(296)  评论(4编辑  收藏  举报