zoukankan      html  css  js  c++  java
  • 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()储存起来,这样就没问题了。

    队列变化图

    代码托管

  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/-zzr-/p/7705046.html
Copyright © 2011-2022 走看看