Java 如何使用堆栈按降序输出素数? 阅读及其父类:Vector 计算前50个素数成员时,不要在找到它们时显示它们,而是将它们存储在堆栈中 一旦找到素数,堆栈将包含找到的所有素数。最小的是堆栈的第一个元素,最大的是堆栈的最后一个元素。从堆栈的末尾开始另一个循环,以降序显示素数。

Java 如何使用堆栈按降序输出素数? 阅读及其父类:Vector 计算前50个素数成员时,不要在找到它们时显示它们,而是将它们存储在堆栈中 一旦找到素数,堆栈将包含找到的所有素数。最小的是堆栈的第一个元素,最大的是堆栈的最后一个元素。从堆栈的末尾开始另一个循环,以降序显示素数。,java,stack,primes,Java,Stack,Primes,注意:Stack是一个旧类,不应该再使用了。您应该更喜欢ArrayList。因为这是一个家庭作业问题,我不会给出代码,但下面是从代码中的某个地方获取的过程 如果数字是素数,则将其推到堆栈上。 当主查找器循环终止时,开始在新循环中从堆栈弹出。数字将按降序弹出,因为它们是按升序推送的。 首先,看一看寻找质数的更好方法的讨论。然后,使用堆栈根据后进先出属性反转顺序。堆栈的一个有趣属性是它可以用于反转顺序。这是因为要推到其上的第一项是最后一项 想象一下,如果我把单词pan的字母一个接一个地推到一堆上。我

注意:Stack是一个旧类,不应该再使用了。您应该更喜欢ArrayList。

因为这是一个家庭作业问题,我不会给出代码,但下面是从代码中的某个地方获取的过程

如果数字是素数,则将其推到堆栈上。 当主查找器循环终止时,开始在新循环中从堆栈弹出。数字将按降序弹出,因为它们是按升序推送的。
首先,看一看寻找质数的更好方法的讨论。然后,使用堆栈根据后进先出属性反转顺序。

堆栈的一个有趣属性是它可以用于反转顺序。这是因为要推到其上的第一项是最后一项

想象一下,如果我把单词pan的字母一个接一个地推到一堆上。我先按p,然后按a,然后按n。现在,因为n是最后一个推送的字母,所以它是第一个从堆栈中弹出的字母。所以,当我删除字母时,我得到n,后面是a,后面是p-nap。通过这种方式,堆栈可以通过将单词视为字符列表来反转单词

对于素数列表也是如此。如果你有一个升序排列的第一个素数的列表,例如:2,3,5,7…,那么你可以使用堆栈执行相同的技巧,将列表按降序排列,方法是将每个列表推到堆栈上,然后读取它们

所以,我要做的是每次你检测到一个素数,把它推到你的堆栈上,直到堆栈上有个素数。然后,将每个项目从堆栈中弹出,以相反顺序打印它们


它可能也值得你把ISHOLD逻辑转换到它自己的函数中,一旦你运行的东西。

边注:考虑使用DEQE而不是堆栈:DeQueStase=新的ArayDeQuy;请参阅栈的Javadoc中的注释:使用LinkedList而不是ArrayDequeok。我将尝试一下,看看我能走多远。谢谢。那你有什么问题吗?我要试着解决一下。谢谢你的建议。。最好是我自己解决注意:Stack是一个旧类,不应该再使用了。您应该更喜欢ArrayList。-uuuhhh不,ArrayList和Stack解决完全不同的问题。@Martin虽然您在某种意义上是正确的,但您应该阅读Stack类的Javadoc,其中指出您可能应该使用不同的东西。具体来说,他们提到了Deque接口@关于我对Martin的评论,这将使首选类成为LinkedList,而不是ArrayList。尽管ArrayList是Vector的典型替代品,这一点仍然存在。还应该注意的是Vector并不是一个坏的类,它只是具有通常不需要的开销。但是为什么要使用List类而不是Deque?Deque为解决排队问题提供了正确的约束条件和更好的接口。@Martin和@glowcoder:因为我的主张建议以相反的顺序迭代堆栈,堆栈是一个向量,因此与ArrayList有关系并通过索引访问它,ArrayList非常适合。没有必要对栈操作进行push,pop,在这个问题上:没有必要清空栈来显示素数。
import java.util.Stack;

public class Primes{
    public static void main(String[]args){
    Stack<Integer> stack = new Stack<Integer>();

    stack.push(null);
    //number of primes to display
    final int NUMBER_OF_PRIMES = 50;
    //number of primes to display per line
    final int NUMBER_OF_PRIMES_PER_LINE = 10;
    //count number of primes
    int count = 0;
    int number = 2;

    System.out.println("The first 50 primes are \n");

    while(count < NUMBER_OF_PRIMES){
        boolean isPrime = true;

    for(int divisor = 2; divisor <= number/2; divisor++){
        if(number % divisor == 0){
            isPrime = false;
            break;
        }
    }
    if(isPrime){
        count++;

        if(count % NUMBER_OF_PRIMES_PER_LINE ==0){
            System.out.println(number);

        }
        else
            System.out.print(number + " ");

    }
    number++;
    }
}
}