别再只盯着Flask了:从Twig到Smarty,手把手教你挖掘PHP模板注入漏洞
2026/6/10 21:54:26
在 Java 中,利用两个队列实现栈的核心思路是通过队列的“先进先出”特性模拟栈的“后进先出”特性:始终让一个队列(记为queue1)存储栈的所有元素,另一个队列(记为queue2)作为临时中转。以下是完整的实现思路和代码示例:
queue1。queue1中除最后一个元素外的所有元素依次转移到queue2,弹出queue1中剩余的最后一个元素(即栈顶元素),然后交换queue1和queue2的角色(让queue2变为空的中转队列)。pop类似,但转移后不弹出最后一个元素,而是记录其值后再将其转移到queue2,最后交换队列角色。queue1是否为空。import java.util.LinkedList; import java.util.Queue; /** * 用两个队列实现栈 */ public class StackByTwoQueues { // 主队列:存储栈的所有元素 private Queue<Integer> queue1; // 临时中转队列 private Queue<Integer> queue2; // 初始化 public StackByTwoQueues() { // 推荐使用LinkedList作为Queue的实现(LinkedList实现了Deque,支持队列操作) queue1 = new LinkedList<>(); queue2 = new LinkedList<>(); } /** * 入栈:直接添加到主队列 * @param x 要入栈的元素 */ public void push(int x) { queue1.offer(x); } /** * 出栈:弹出栈顶元素(最后入队的元素) * @return 栈顶元素 * @throws RuntimeException 栈为空时抛出异常 */ public int pop() { if (isEmpty()) { throw new RuntimeException("栈为空,无法执行pop操作"); } // 将queue1中除最后一个元素外的所有元素转移到queue2 while (queue1.size() > 1) { queue2.offer(queue1.poll()); } // 弹出queue1中剩余的最后一个元素(栈顶) int top = queue1.poll(); // 交换两个队列的角色:让queue1重新作为主队列,queue2为空 Queue<Integer> temp = queue1; queue1 = queue2; queue2 = temp; return top; } /** * 获取栈顶元素(不弹出) * @return 栈顶元素 * @throws RuntimeException 栈为空时抛出异常 */ public int peek() { if (isEmpty()) { throw new RuntimeException("栈为空,无法执行peek操作"); } // 逻辑同pop,但保留最后一个元素 while (queue1.size() > 1) { queue2.offer(queue1.poll()); } int top = queue1.peek(); // 将最后一个元素也转移到queue2 queue2.offer(queue1.poll()); // 交换队列角色 Queue<Integer> temp = queue1; queue1 = queue2; queue2 = temp; return top; } /** * 判断栈是否为空 * @return 空返回true,否则返回false */ public boolean isEmpty() { return queue1.isEmpty(); } // 测试示例 public static void main(String[] args) { StackByTwoQueues stack = new StackByTwoQueues(); // 入栈:1 -> 2 -> 3 stack.push(1); stack.push(2); stack.push(3); // 输出栈顶:3 System.out.println("栈顶元素:" + stack.peek()); // 出栈:3 System.out.println("出栈元素:" + stack.pop()); // 输出栈顶:2 System.out.println("栈顶元素:" + stack.peek()); // 出栈:2 System.out.println("出栈元素:" + stack.pop()); // 出栈:1 System.out.println("出栈元素:" + stack.pop()); // 判空:true System.out.println("栈是否为空:" + stack.isEmpty()); } }LinkedList实现Queue接口(LinkedList支持队列的offer/poll/peek操作,效率高)。pop和peek操作时,若栈为空则抛出运行时异常,符合栈的常规行为。pop/peek后交换queue1和queue2的引用,避免重复创建队列,节省内存。若希望降低pop/peek的时间复杂度,可改用一个队列 + 记录栈顶的方式: