队列数据结构的典型应用_数据结构如何建立多个队列

Java (52) 2023-08-31 10:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说队列数据结构的典型应用_数据结构如何建立多个队列,希望能够帮助你!!!。

使用队列实现杨辉三角

队列数据结构的典型应用_数据结构如何建立多个队列_https://bianchenghao6.com/blog_Java_第1张

杨辉三角的特点:

除了第一行,其他行两端都为1;

从第三行开始可以看出,除了两端,其中每个数都是元素本身上面对着的两个数的和;

奇数行有奇数个数,偶数行有偶数个数,都是n个数

每行数从左端开始看到中间都是升序,都是正序。

想要用代码来实现杨辉三角最简单的方法就是使用两个数组来实现,互相承载结果,并将数组打印出来。但结合杨辉三角的特点,正序可以想到用队列的问题来解决。

解决方案:

可以想到,作为开端的1可以看成是0和1的和,因此开始可以将队列设成这样(此处是以3行为例子)

队列数据结构的典型应用_数据结构如何建立多个队列_https://bianchenghao6.com/blog_Java_第2张

设定变量a和b来作为队列第一个元素和第二个元素的载体。在a获取了第一个元素后将第一个元素移出队列,然后让b获取新的第一个元素,然后将a和b加起来,并将结果移进队列中,并将结果打印出来

队列数据结构的典型应用_数据结构如何建立多个队列_https://bianchenghao6.com/blog_Java_第3张

然后重复上述步骤,可以得到:

队列数据结构的典型应用_数据结构如何建立多个队列_https://bianchenghao6.com/blog_Java_第4张

要能够获取第二行的值,我在第一行中进行两次和运算即可,第一轮到此也就可以停止了。

然后,让一个0入列,再次重复上面的步骤,具体流程大概是这样:

队列数据结构的典型应用_数据结构如何建立多个队列_https://bianchenghao6.com/blog_Java_第5张

遇到的问题:

最初的原代码:

package ch15;

import java.util.Scanner;

/**

* Created by Funny_One on 2017/10/13.

*/

public class YangHuiTriangle {

public static void main(String[] args) {

CircularArrayQueue queue = new CircularArrayQueue();

Scanner sca = new Scanner(System.in);

System.out.println("需要显示的行数:");

int n = sca.nextInt();

queue.enqueue(0);

queue.enqueue(1);

System.out.println(1);

for(int times =0;times

queue.enqueue(0);

for(int i=1;i

int a,b=0,c;

if(queue.size()==1){

a = b;

b = queue.first();

c = a + b;

queue.enqueue(c);

System.out.print(c);

}else {

a=queue.first();

queue.dequeue();

b = queue.first();

queue.dequeue();

c = a+b;

queue.enqueue(c);

System.out.print(c+" ");

}

}

System.out.println();

}

}

}

运行的结果是:

队列数据结构的典型应用_数据结构如何建立多个队列_https://bianchenghao6.com/blog_Java_第6张

可以见到,其中出现的问题有:

问题1:每一行只有一个元素;

问题2:每个元素都是1;

问题3: 不只有三行;

在我进行调试之后,发现这些问题的原因是:

问题1的原因:在我的代码中,当a和b将数据获取之后,一个1入列,1被打印出来,同时两个数被移出队列。此时的queue.size()= 2而i从1也变成2了,所以该循环结束,下面的也是如此的情况,因此一行就只有一个元素

问题2的原因:在第一轮之后,队列中只有两个数:0和1,因此做和运算后便只有打印1出来。

问题3的原因:因为最初先加了一行1,后面的关于times的循环有三次,因此会有四行出现。

修改后:

for(int times =0;times

queue.enqueue(0);

int viceTimes = queue.size()-1;

for(int m =n-times; m>=0;m--){

System.out.print(" ");

}

for(int i=1;i<=viceTimes;i++){

int a,b=0,c;

a=queue.first();

queue.dequeue();

b = queue.first();

c = a+b;

queue.enqueue(c);

System.out.print(c+" ");

}

System.out.println();

}

用一个变量viceTimes来承载进行和运算的次数,并且该值固定不变。这样就能解决问题了。

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复