Миссия состоит в том, чтобы проверить, есть ли в стеке какое-либо число, цифра его единиц совпадает с числом, которое я выбираю. И после того, как я это сделаю, мне нужно снова распечатать тот же стек, но когда я проверил цифру единиц, стек остается пустым. Поэтому мне нужна ваша помощь, чтобы сохранить стек таким, каким он был в начале. Кстати, учитель сказал, что я могу использовать связанный список, чтобы сохранить стек таким, какой он был.
Вот код:
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);
}
}
Идея состоит в том, чтобы взять элементы из стека и поместить их в связанный список. Когда наш поиск завершен, мы возвращаем их обратно в обратном порядке.
Чтобы быть типобезопасным, я добавил <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);
}
}
@Yonatan - вы можете просто использовать второй стек вместо связанного списка. извлеките из исходного стека, нажмите на второй стек, как только совпадение будет найдено, затем отмените это, попав из второго стека, нажав на первый стек.
Спасибо за положительный отзыв :), приму к сведению. Кстати, мой учитель сказал, что я могу использовать связанный список или другой стек. :)
Добро пожаловать! Вы предоставили хорошую отправную точку с вашим кодом. Возможные улучшения:
count
должна быть логической переменной. С операторомbreak;
вы можете выйти из цикла после нахождения соответствующего элемента. Это позволит избежать ненужного всплывающих элементов.