Java数据结构【队列应用】

利用队列求解素数环问题


素数:又称质数(prime number),有无限个。素数定义为在大于1的自然数中,除了1和本身以外的数不在有其他因数的数称为素数。


在这里我使用的开发环境是IEDEA

待解决的问题:

         N各自然数(1~N)排列成环形,使得每相邻两个数之和为素数,构成一个素数环。

解决思想:

        建立两个队列,一个存放操作对象(n),一个存放素数(primeQueue),初始元素为1。

我们将工作队列里面的元素依次与素数队列里面的尾元素相加,如果值为素数就将工作栈的该元素加入到素数队列的尾部,如果值不是素数,则加在工作队列的尾部,等待下一次相加。在上诉操作的同时,check_times计数器也在记数,如果循环多次后check_times的值不变,则程序结束。

这里我们直接在队列里面来完成,边完成任务边介绍方法:

stap1:

        建立两个队列,一个用于工作,一个用于存放素数

   private static  QQueue primeQueue = new LinkedQueue();  

    
   private static  QQueue workQueue = new LinkedQueue();  

   QQueue是我们创建好的队列,既可以是顺序队列,也可以是链式的

      QQueue里面的方法有:     

​
    public boolean isEmpty();    //判空
	
	public boolean enQueue(E element);  //入队
	
	public E deQueue();   //出队

	public void show();   //显示

	public E getRear();   //获取表尾元素

	public int length();  //获取表长

​

stap2:

确定相关的方法

1、定义对象

2、将对象加入队列

3、判断是否是素数

4、判断是否能够构成素数环,这里需要定义一个计数器来判断是否可以构成素数环(checl_times)。

       int n =7;    //定义操作对象,这里的n是合理任意数值

       int check_time = 0;      //定义计数器

 for (int i = 2; i <= n; i++ )  //将对象遍历加入到队列中
        {
            workQueue.enQueue(i);
        }


for (int i = 2;i < n;i++)       //判断是否是素数
            {
                if (n%i == 0)
                {
                    flag = false;
                    break;
                }


  check_time ++;     //计数器开始计数,注意:当计数器开始计数到值不变是,说程序结束

stap3:

方法的实现:

/*如果可以构造成素数环,则直接显示元素,如果不能则输出:“不能构造素数环” */
 if (constructPrime(n))
        {
            primeQueue.show();
        }
        else
        {
            System.out.println(n+"不能构造素数环");

        }


/*判断是否是素数*/

 private static boolean isPrime(int n)
        {
            boolean flag = true;

            for (int i = 2;i < n;i++)
            {
                if (n%i == 0)
                {
                    flag = false;
                    break;
                }
            }
            return flag;
        }


//将操作随想遍历并加入队列里面
 for (int i = 2; i <= n; i++ )
        {
            workQueue.enQueue(i);
        }
      //  workQueue.show();      输出打印如队列的元素

完整代码:

public class PrimeDemo {
    //先创建两个队列
    private static  QQueue primeQueue = new LinkedQueue();     //素数环队列

    private static  QQueue workQueue = new LinkedQueue();      //工作队列
    //创建静态块
    static {
        //先将素数1入栈
        primeQueue.enQueue(1);
    }
    private static boolean constructPrime(int n)
    {
        boolean flag = false;
        //记录检测次数
        int check_time = 0;
        //将数加入工作队列
        for (int i = 2; i <= n; i++ )
        {
            workQueue.enQueue(i);
        }
      //  workQueue.show();
        //判断队列不为空,且记录次数
        while (!workQueue.isEmpty() && check_time < workQueue.length())
        {
            //先将需要进行操作的数出栈,且判断是否是素数
            int e = workQueue.deQueue();

            //如果是素数,加入素数环队列尾部(栈顶)
            if (isPrime(e + primeQueue.getRear()))
            {
                primeQueue.enQueue(e);
            //将记录次数清除为零
                check_time = 0;
            }
            //不是素数
            else {
                //加入工作栈尾部
                workQueue.enQueue(e);
                //记录入栈次数
                check_time ++;
            }
        }
        if (workQueue.isEmpty())
        {
            flag = true;
        }
        return flag;
    }
        private static boolean isPrime(int n)
        {
            boolean flag = true;

            for (int i = 2;i < n;i++)
            {
                if (n%i == 0)
                {
                    flag = false;
                    break;
                }
            }
            return flag;
        }

    public static void main(String[] args) {
        int n =7;
        if (constructPrime(n))
        {
            primeQueue.show();
        }
        else
        {
            System.out.println(n+"不能构造素数环");

        }
    }

}

你可能感兴趣的:(数据结构,算法)