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

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

Вот код:

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

}
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
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

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