Как сканировать стек, не повреждая структуру стека

Миссия состоит в том, чтобы проверить, есть ли в стеке какое-либо число, цифра его единиц совпадает с числом, которое я выбираю. И после того, как я это сделаю, мне нужно снова распечатать тот же стек, но когда я проверил цифру единиц, стек остается пустым. Поэтому мне нужна ваша помощь, чтобы сохранить стек таким, каким он был в начале. Кстати, учитель сказал, что я могу использовать связанный список, чтобы сохранить стек таким, какой он был.

Вот код:

   public static boolean isExist(int num,Stack <Integer> stk) {
       int count=0;
       while(!stk.isEmpty()) {
           
           if (stk.pop()%10==num) {
               
               count++;
           }
           else {
               count=count;
           }
       }
       if (count>0) {
           return true;
       }
       else {
           return false;
       }
       
       
   }
   public static void main(String[] args) {
       Stack stk=new Stack();
       for(int i=0;i<10;i++) {
           stk.push(i*24);
       }
       System.out.println(stk);
       System.out.println(isExist(8, stk));
       System.out.println(stk);
   }

}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Идея состоит в том, чтобы взять элементы из стека и поместить их в связанный список. Когда наш поиск завершен, мы возвращаем их обратно в обратном порядке.

Чтобы быть типобезопасным, я добавил <Integer> в стек и в список.

import java.util.Stack;
import java.util.LinkedList;

public class StackCheck {
    public static boolean isExist(int num, Stack<Integer> stk) {
        LinkedList<Integer> list = new LinkedList<>();
        int count = 0;
        while (!stk.isEmpty()) {
            Integer element = stk.pop();
            list.addFirst(element); // add to front of list
            if (element % 10 == num) {
                count++;
            }
            // Your else branch didn't do anything. Removed.
        }
        // Now put the popped elements back.
        // Start at front.
        for (int i = 0; i < list.size(); i++) {
            stk.push(list.get(i));
        }

        if (count > 0) {
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
        Stack<Integer> stk = new Stack<>();
        for (int i = 0; i < 10; i++) {
            stk.push(i * 24);
        }
        System.out.println(stk);
        System.out.println(isExist(8, stk));
        System.out.println(stk);
    }

}
$ java StackCheck.java
[0, 24, 48, 72, 96, 120, 144, 168, 192, 216]
true
[0, 24, 48, 72, 96, 120, 144, 168, 192, 216]
$

Запустите код онлайн на https://www.online-java.com/C341zqXmJ7

Версия с улучшениями:

  • используйте логическую переменную и остановите выталкивание элементов, когда соответствующий элемент будет найден
  • использовать лямбда-функцию для восстановления стека
  • добавлен вариант с временным стеком в качестве комментариев
import java.util.Stack;
import java.util.LinkedList;

public class StackCheck {
    public static boolean isExist(int num, Stack<Integer> stack) {
        LinkedList<Integer> list = new LinkedList<>(); // Stack<Integer> tmpStack = new Stack<>();
        boolean exists = false;
        while (!stack.isEmpty()) {
            int element = stack.pop();
            list.addFirst(element); // tmpStack.push(element);
            if (element % 10 == num) {
                exists = true;
                break;
            }
        }
        list.forEach(e -> stack.push(e)); // while (!tmpStack.isEmpty()) {stack.push(tmpStack.pop());} 
        return exists;
    }
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < 10; i++) {
            stack.push(i * 24);
        }
        System.out.println(stack);
        System.out.println(isExist(8, stack));
        System.out.println(stack);
    }
}

Добро пожаловать! Вы предоставили хорошую отправную точку с вашим кодом. Возможные улучшения: count должна быть логической переменной. С оператором break; вы можете выйти из цикла после нахождения соответствующего элемента. Это позволит избежать ненужного всплывающих элементов.

Franck 16.05.2022 22:50

@Yonatan - вы можете просто использовать второй стек вместо связанного списка. извлеките из исходного стека, нажмите на второй стек, как только совпадение будет найдено, затем отмените это, попав из второго стека, нажав на первый стек.

rcgldr 16.05.2022 23:37

Спасибо за положительный отзыв :), приму к сведению. Кстати, мой учитель сказал, что я могу использовать связанный список или другой стек. :)

Yonatan 16.05.2022 23:53

Другие вопросы по теме