题解 | 栈的压入、弹出序列

栈的压入、弹出序列

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;
    }
}

全部评论

相关推荐

认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务