• 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()储存起来,这样就没问题了。

    队列变化图

    代码托管

  • 相关阅读:
    Ping
    boost::python开发环境搭建
    mingw和libcurl
    ssh远程执行命令使用明文密码
    netty源码阅读之UnpooledByteBufAllocator
    Direct ByteBuffer学习
    clions的使用
    netty中的PlatformDependent
    STL之priority_queue(优先队列)
    c++线程调用python
  • 原文地址:https://www.cnblogs.com/-zzr-/p/7705046.html
Copyright © 2020-2023  润新知