• (5)剑指Offer之栈变队列和栈的压入、弹出序列


    一 用两个栈实现队列

    题目描述:

    用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    问题分析:

    先来回顾一下栈和队列的基本特点:
    栈:后进先出(LIFO)
    队列: 先进先出
    很明显我们需要根据JDK给我们提供的栈的一些基本方法来实现。先来看一下Stack类的一些基本方法:
    Stack类的一些常见方法

    既然题目给了我们两个栈,我们可以这样考虑当push的时候将元素push进stack1,pop的时候我们先把stack1的元素pop到stack2,然后再对stack2执行pop操作,这样就可以保证是先进先出的。(负[pop]负[pop]得正[先进先出])

    考察内容:

    队列+栈

    示例代码:

    //左程云的《程序员代码面试指南》的答案
    import java.util.Stack;
    
    public class Solution {
        Stack<Integer> stack1 = new Stack<Integer>();
        Stack<Integer> stack2 = new Stack<Integer>();
    
        //当执行push操作时,将元素添加到stack1
        public void push(int node) {
            stack1.push(node);
        }
    
        public int pop() {
            //如果两个队列都为空则抛出异常,说明用户没有push进任何元素
            if(stack1.empty()&&stack2.empty()){
                throw new RuntimeException("Queue is empty!");
            }
            //如果stack2不为空直接对stack2执行pop操作,
            if(stack2.empty()){
                while(!stack1.empty()){
                    //将stack1的元素按后进先出push进stack2里面
                    stack2.push(stack1.pop());
                }
            }
              return stack2.pop();
        }
    }

    二 栈的压入、弹出序列

    题目描述:

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

    题目分析:

    这道题想了半天没有思路,参考了Alias的答案,他的思路写的也很详细应该很容易看懂。
    作者:Alias
    https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106
    来源:牛客网

    【思路】借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。

    举例:

    入栈1,2,3,4,5

    出栈4,5,3,2,1

    首先1入辅助栈,此时栈顶1≠4,继续入栈2

    此时栈顶2≠4,继续入栈3

    此时栈顶3≠4,继续入栈4

    此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3

    此时栈顶3≠5,继续入栈5

    此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3

    ….
    依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。

    考察内容:

    示例代码:

    import java.util.ArrayList;
    import java.util.Stack;
    //这道题没想出来,参考了Alias同学的答案:https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106
    public class Solution {
        public boolean IsPopOrder(int [] pushA,int [] popA) {
            if(pushA.length == 0 || popA.length == 0)
                return false;
            Stack<Integer> s = new Stack<Integer>();
            //用于标识弹出序列的位置
            int popIndex = 0;
            for(int i = 0; i< pushA.length;i++){
                s.push(pushA[i]);
                //如果栈不为空,且栈顶元素等于弹出序列
                while(!s.empty() &&s.peek() == popA[popIndex]){
                    //出栈
                    s.pop();
                    //弹出序列向后一位
                    popIndex++;
                }
            }
            return s.empty();
        }
    }
  • 相关阅读:
    快速提交一个项目到github或gitee上
    微信web开发问题记录
    解决 VUE项目过大nodejs内存溢出问题
    vue使用动态渲染v-model输入框无法输入内容
    webstorm 支持vue element-ui 语法高亮属性自动补全
    spring websocket报错:No matching message handler methods.
    Failed to start bean 'stompBrokerRelayMessageHandler'; nested exception is java.lang.NoClassDefFoundError: reactor/io/codec/Codec
    远程调用appium server
    appium 特殊操作
    mac下搭建appium
  • 原文地址:https://www.cnblogs.com/snailclimb/p/9086380.html
Copyright © 2020-2023  润新知