Java中反转栈

3
    public static void reverse(Stack arr){
    Queue<Integer> arrCopy=new LinkedList<Integer>();
    while(!arr.empty()){
        arrCopy.add((int)arr.pop());
    };
    System.out.print("{ ");
    while(!arrCopy.isEmpty()){
        System.out.print((int)arrCopy.remove() + ", ");
    }
    System.out.print("}");
}

所以,我有一个包含10个整数的栈,并希望以相反的顺序打印它。我编写了一个新方法,创建一个队列,每次使用pop从堆栈中删除并返回整数时,它将其添加到队列中。问题在于,while(!arrCopy.isEmpty())似乎没有执行,队列为空。这里是否存在转换问题?或者是我添加元素到队列的方式有问题?
谢谢!
编辑:这是我的主要函数代码(也是我的其余代码):
public static void main(String[] args) {
        Random rand = new Random();
        Stack<Integer> a=new Stack<Integer>();

        for (int i=0; i<10; i++){
            a.push(rand.nextInt(50));
        }
        System.out.print("{ ");
        while(!a.empty()){
            System.out.print((int)a.pop() + ", ");
        }
        System.out.print("}");

        reverse(a);


}

解决方案: 我终于让它工作了,谢谢!问题在于我使用pop从栈中返回(同时删除)所有元素,以便在反转之前打印它,这导致了一个空栈。这是我为了让它工作所做的修改!

    public static Queue reverse(Stack arr){
    Queue<Integer> arrCopy=new LinkedList<Integer>();
    while(!arr.empty()){
        arrCopy.add((int)arr.pop());
    }
    return arrCopy;
}

public static void main(String[] args) {
        Random rand = new Random();
        Stack<Integer> a=new Stack<Integer>();

        for (int i=0; i<10; i++){
            a.push(rand.nextInt(50));
        }

         System.out.println("List:");
         System.out.println(a);

         System.out.println("Reversed List:");
         System.out.println(reverse(a));


}

1
我刚刚测试了你的代码,它在这里运行得很好。你给函数输入了什么? - undefined
1
你确定你的Stack不是空的吗? - undefined
你能给我们展示一下Stack的代码吗? - undefined
我非常确定栈不是空的,因为我已经打印出来进行了测试。栈可以正常打印,但是反向为空。我的输入是在主函数中初始化并给定了随机整数的栈数组。 - undefined
你正在将一个空栈传递给函数。在打印栈时,你正在弹出所有的元素。因此,在将其传递给函数之前,你的栈已经变为空。 - undefined
显示剩余3条评论
2个回答

2

使用下面的代码反转堆栈顺序,这样可以颠倒顺序。

import java.util.Collections;
import java.util.Stack;

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

        for (int i = 0; i < 10; i++) {
            stack.push(i);
        }

        System.out.println("Before reverse" + stack);
        reverse(stack);
    }

    public static void reverse(Stack<Integer> arr){
        arr.sort(Collections.reverseOrder());
        System.out.println("After reverse");
        System.out.println(arr);
    }
}

输出结果为:
Before reverse[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
After reverse
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

1
这里:
while(!a.empty()){
    System.out.print((int)a.pop() + ", ");
}
System.out.print("}");

reverse(a);

你在调用reverse方法之前清空了栈。如果你不断弹出元素,直到a.empty()返回true,那么你就已经清空了栈,并且将一个空栈传递给了reverse方法。
为什么不直接使用:
System.out.println(a);
reverse(a);

不需要弹出栈中的所有元素才能打印它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接