欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

20162311 队列加分项

程序员文章站 2022-03-12 23:11:05
...

20162311 队列加分项

作业目标

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

具体步骤

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

打印杨辉三角这个作业,其实之前在学第十一章递归的时候,我就已经做过了,是一个课后的作业,只不过当时用的是数组
20162311 队列加分项
20162311 队列加分项
所以整体思路还是有的,只不过是把数组换成了队列。不同的地方在于,数组可以直接访问任意位置的元素,而队列不行。我先定义一个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;
            }
        }

二、单步跟踪过程和遇到的问题及解决过程

写好之后我先运行了一下,但是结果却出了问题
20162311 队列加分项
结果和预期的不一样,于是我设置断点进行调试
20162311 队列加分项
我在获取第n行元素时,用递归的方法先获取第n-1行元素,然后把他们放到一个数组中,方便后面计算。但这里循环有问题。这里j<newQueue.size(),本来是可以的,但是循环体里的语句有newQueue.dequeue(),而这条语句执行完,再次执行循环时,newQueue的size就发生改变了,所以循环的次数少了。于是我先用一个int类型变量把最初的newQueue.size()储存起来,这样就没问题了。
20162311 队列加分项
20162311 队列加分项

队列变化图

20162311 队列加分项

代码托管