20162311 队列加分项

20162311 队列加分项

作业目标

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

具体步骤

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

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

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

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

队列变化图

1063734-20171021160535302-992516853.jpg

代码托管

转载于:https://www.cnblogs.com/-zzr-/p/7705046.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有限阻塞对列 题目背景: wps文档在线纠错有一种场景,需要把文档内容发送到服务端纠错,纠错完成后返回客户端完成文档纠错。这一过程中,文档中首先需要被‘分句’,文档内容被分成一个一个单句,然后被存放到一个有限大小的队列中等待被执行。如果队列满,添分句的线程被阻塞直到队列非满。 当分句的队列不为空时,说明文档有内容需要被调用纠错,此时需要把分句发送到纠错服务器校验,被校验过后的分句将从队列中将其删除. 如果队列为空,处理分句的线程被阻塞直到队列非空。 功能需求: 请使用c++实现一个拥有如下方法的线程安全有限阻塞队列, class BoundedBlockingQueue(int capacity) 构造方法初始化队列,其中capacity代表队列长度上限 void enqueue(int element) 通过enqueue函数在队列中增一个element. 如果队列满,调用线程被阻塞直到队列非满。 int dequeue() 通过dequeue函数在队列中处理一个element,随之将其从队列中删除. 如果队列为空,调用线程被阻塞直到队列非空。 int size() 返回当前队列元素个数。 该队列将会被多线程同时访问。每一个线程要么是一个只调用enqueue方法的生产元素,要么是一个只调用dequeue方法消化元素。 你需要实现该"有限阻塞队列"类,并且模拟其在多线程环境下的执行情况。 注意事项: 1 如果使用线程间通信,选择你认为最合适的方式并给出理由。 2尽可能使用线程池来提高程序执行效率(分项)。
04-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值