Обращение ArrayList целых чисел с помощью стека - PullRequest
0 голосов
/ 14 марта 2019

Так что мне удалось реализовать реверсирование ArrayList (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);
    }
}

Ошибка - пустая ошибка стека.

Ответы [ 4 ]

1 голос
/ 14 марта 2019

Вместо

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 голос
/ 14 марта 2019

Как уже указывалось, одной из основных проблем является эта часть:

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
}
1 голос
/ 14 марта 2019

Не изобретая колесо, вы не можете просто использовать:

Collections.reverse(list);

Когда дело доходит до вопроса, здесь:

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

Вы всегда удаляете первый элемент, но потом получаете немного посередине, это приводит к потере некоторых элементов. Вы должны использовать Iterator для этого. Проверьте документацию для подробного описания.

0 голосов
/ 14 марта 2019
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;
}

есть много способов изменить ситуацию, но кажется, что для вас важно использовать стек, поэтому немного измените свой метод с помощью приведенного выше кода

...