借助堆栈反转整数的ArrayList

问题描述 投票:-1回答:4

所以我已经设法在堆栈的帮助下实现了反转一个ArrayList(of Strings),但是我无法弄清楚如何用整数来实现它。我得到一个堆空错误,任何想法? 【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);
    }
}

错误是空堆栈错误。

java arraylist java-8 stack reversing
4个回答
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();

它应该工作正常。


1
投票

没有重新发明轮子,你不能只使用:

Collections.reverse(list);

说到问题,这里:

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

你总是删除第一个元素,但之后在中间获得一些元素,这会导致丢失一些元素。你应该使用Iterator。有关详细说明,请查看documentation


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
}

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;
}

有很多方法可以解决问题,但似乎使用堆栈很重要,所以用上面的代码稍微改变你的方法

© www.soinside.com 2019 - 2024. All rights reserved.