题解 | 栈的压入、弹出序列
栈的压入、弹出序列
https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106
import java.util.*; public class Solution { // 根据栈的压入顺序,判断第二个序列是否为该栈的弹出序列 // 思路:通过模拟栈的方式来解决,将压入序列视为栈,将弹出序列视为队列 // 对于压入序列,每次压入后,检查栈顶元素是否等于队列队头元素,如果等于,则分别弹出栈顶元素和队列队头元素 // 直到栈为空或者栈顶元素不等于队列队头元素 // 当所有的压入序列都被遍历后,可以直接依次比较栈内元素与队列元素的值,如果存在不一样的顺序,则表示判断失败 public boolean IsPopOrder (int[] pushV, int[] popV) { // write code here // Stack<Integer> stack1 = new Stack<>(); // 首先将第一个元素压入 Queue<Integer> queue = new LinkedList<>(); // 将弹出序列放入先入先出的队列中,当匹配到对应的入栈元素后,队头元素出列; for (int i = 0; i < popV.length; i++) { queue.add(popV[i]); } // 如果栈顶元素等于弹出队列的头结点,则将辅助栈顶元素弹出,并移动到弹出序列的下一个元素 // 如果不等于则继续入栈,入栈队列为空之后,就只需要判断栈顶元素是否等于队列队头元素 for (int i = 0; i < pushV.length; i++) { stack1.add(pushV[i]); // 这里pop之后的新的栈顶元素要靠循环来处理,直到栈为空或者栈顶元素不等于队列队头元素 // 这里如果用 == 的话,-900 == -900 被判断为false,因为这里是Integer类型 /** 在 Java 中,当你使用==比较两个 Integer 对象时,实际上比较的是它们的引用(内存地址),而不是它们的值。这是因为==运算符在比较对象时,比较的是对象的内存地址,而不是对象的内容。 Java 为了提高性能和节省内存,对 Integer 对象做了一些优化: 对于值在 - 128 到 127 之间的 Integer 对象,Java 会使用缓存池中的对象 当你创建一个值在这个范围内的 Integer 对象时,Java 会直接返回缓存池中的对象引用 对于值超出这个范围的 Integer 对象,每次都会创建新的对象 */ while (stack1.peek().equals(queue.peek())) { stack1.pop(); queue.poll(); if(stack1.isEmpty()) break; } } while (!stack1.isEmpty()) { if (stack1.pop() != queue.poll()) { return false; } } return true; } }