最近一个需求,需要对客户端埋点日志数据进行合并处理,需要用到栈结构特性进行对埋点开始和结尾配对,要做到取出栈中指定数据并不改变栈原有结构,在这里需要用到一个临时栈暂存,当然也可以用个List存储~,分析如下:
1、将初始栈从栈顶进行挨个弹出,若不是我们想要的值 3,就将当前栈压入临时栈中
2、弹出我们要的值 3,此时临时栈中有[7,6,5,4]
3、将临时栈的值依次再放入原初始化栈得到最终栈
Java代码如下:
import java.util.Stack;
/**
* StackDemo
*
* @author lcry
* @date 2020/11/11 21:02
*/
public class StackDemo {
private final Stack<Integer> tempStack = new Stack<>();
public static void main(String[] args) {
Stack<Integer> integerStack = new Stack<>();
integerStack.push(1);
integerStack.push(2);
integerStack.push(3);
integerStack.push(4);
integerStack.push(5);
integerStack.push(6);
integerStack.push(7);
System.out.println("初始化栈:" + integerStack);
StackDemo stackDemo = new StackDemo();
Integer pop = stackDemo.recursionStack(3, integerStack);
System.out.println("弹出后栈里的内容:" + integerStack);
System.out.println("弹出的值:" + pop);
}
/**
* 递归弹出指定栈中的值
*
* @param i 要弹出的值
* @param stack 初始栈
* @return 弹出的值
*/
public Integer recursionStack(Integer i, Stack<Integer> stack) {
if (stack.isEmpty()) {
while (!tempStack.isEmpty()) {
Integer pop2 = tempStack.pop();
stack.push(pop2);
}
return null;
}
Integer pop1 = stack.pop();
if (i.equals(pop1)) {
while (!tempStack.isEmpty()) {
Integer pop2 = tempStack.pop();
stack.push(pop2);
}
return pop1;
} else {
tempStack.push(pop1);
}
return recursionStack(i, stack);
}
}
执行结果如下:
初始化栈:[1, 2, 3, 4, 5, 6, 7]
弹出后栈里的内容:[1, 2, 4, 5, 6, 7]
弹出的值:3