如何在不破坏堆栈结构的情况下扫描堆栈
How to scan a stack without damaging the structure of the stack
任务是检查堆栈中是否有任何数字他的单位数字与我选择的数字相同。
在我这样做之后,我需要再次打印相同的堆栈,但是当我检查单位数字时,堆栈仍然是空的。
所以我需要你的帮助来保持堆栈在开始时的状态。
顺便说一句,老师说我可以使用链表来保持堆栈原样。
代码如下:
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);
}
}
思路是从栈中取出元素,放入链表中。搜索完成后,我们将它们以相反的顺序放回原处。
为了成为 type-safe,我将 <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
有改进的版本:
- 使用布尔变量并在找到匹配元素时停止弹出元素
- 使用lambda函数恢复堆栈
- 添加了带有临时堆栈的变体作为注释
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);
}
}
任务是检查堆栈中是否有任何数字他的单位数字与我选择的数字相同。 在我这样做之后,我需要再次打印相同的堆栈,但是当我检查单位数字时,堆栈仍然是空的。 所以我需要你的帮助来保持堆栈在开始时的状态。 顺便说一句,老师说我可以使用链表来保持堆栈原样。
代码如下:
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);
}
}
思路是从栈中取出元素,放入链表中。搜索完成后,我们将它们以相反的顺序放回原处。
为了成为 type-safe,我将 <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
有改进的版本:
- 使用布尔变量并在找到匹配元素时停止弹出元素
- 使用lambda函数恢复堆栈
- 添加了带有临时堆栈的变体作为注释
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);
}
}