借助堆栈反转整数数组列表

时间:2019-03-14 14:53:38

标签: java arraylist java-8 stack reversing

因此,我设法借助堆栈实现了对ArrayList(字符串)的反转,但是我无法弄清楚如何对整数进行处理。我收到堆栈为空的错误,有什么想法吗? [Java]

代码如下:

package Class;

import java.util.ArrayList;
import java.util.Stack;

public class Class 
{
    static ArrayList<Integer> list = new ArrayList();
    static Stack<Integer> stack = new Stack();

    public static ArrayList<Integer> reverseList(ArrayList<Integer> n)
    {
        for(int i = 0; i < n.size(); i++)
        {
            stack.push(n.get(i));
            n.remove(0);
        }
        for(int i = 0; i != stack.size();)
        {
            n.add(stack.pop());
        }
        return n;
    }

    public static void main(String[] args)
    {
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        System.out.println(list);
        ArrayList n = reverseList(list);
        System.out.println(n);
    }
}

错误是空堆栈错误。

4 个答案:

答案 0 :(得分:1)

如果不重新发明轮子,就不能使用:

Collections.reverse(list);

涉及问题时,请点击此处:

for(int i = 0; i < n.size(); i++)
{
    stack.push(n.get(i));
    n.remove(0);
}

您始终会删除第一个元素,但是在此之后添加一些中间元素会导致某些元素丢失。为此,您应该使用Iterator。请查看documentation了解详细说明。

答案 1 :(得分:1)

代替

for(int i = 0; i < n.size(); i++)
{
    stack.push(n.get(i));
    n.remove(0);
}

执行此操作

for(int i = 0; i < n.size(); i++)
{
    stack.push(n.get(i));
}
n.clear();

它应该可以正常工作。

答案 2 :(得分:1)

正如已经指出的那样,这是一个主要问题:

for(int i = 0; i < n.size(); i++)
{
  stack.push(n.get(i));
  n.remove(0);
}

在这里,您总是从列表中删除第一个元素,但是将元素从索引i处添加到堆栈中。

让我们分析一下您的1、2、3、4、5列表:

  • 第1步:i = 0,因此您按1并从列表中删除1,现在列表变为2、3、4、5
  • 第2步:i = 1,因此您按3并删除2,所以现在的列表是3、4、5
  • 第3步:i = 2,所以您按5并删除3。列表现在为4、5,并且长度小于i,因此循环停止。

问题:您没有调整i以适应删除要求。

按照m.k的建议,您可以将所有元素添加到堆栈中,然后删除所有元素。

或者使用迭代器:

for( Iterator<Integer> itr = n.iterator(); itr.hasNext(); ) {
  stack.push(itr.next()); //this advances the iterator so only call next() once per iteration
  itr.remove(); //this removes the element from the list
}

答案 3 :(得分:0)

public static ArrayList<Integer> reverseList(ArrayList<Integer> n) {
    for(int i = n.size()-1; i >=0; i--) {
        stack.push(n.get(i));
    }
    n.clear();
    while (stack.size() !=0)
        n.add(stack.pop());
    return n;
}

有很多方法可以逆转事情,但是使用堆栈似乎很重要,因此请使用上面的代码稍微更改一下方法