zoukankan      html  css  js  c++  java
  • 剑指offer 22:验证栈的压入、弹出序列

    题目描述

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

    解题思路

    栈的压入与弹出,需明确的一点就是出入栈的顺序是反向执行的,不存在跳跃执行的过程,说直白一点就是,已知入栈的顺序,当出栈的时候,要么出栈元素位于栈顶,要么待出栈的元素还未入栈,不可能出现待出栈的元素还位于栈顶元素之下的情况。因此此题目的解题思路也即明确。

    1.设置两个指示指针分别指向入栈序列和出栈序列,初始为0;

    2.定义一个stack开始出入栈操作。

    3.将出栈序列的当前元素与入栈序列当前元素比较,看是否相等,相等则一起出栈,若不相等,则入栈序列继续入栈,知道放入的元素与当前出栈元素相同,若所有元素入栈后仍不匹配,则此出栈序列非法。

    4.循环执行3,直到出栈序列元素全部为空,此时说明出栈序列合法。

    C++代码实现:

    class Solution {
    public:
        bool IsPopOrder(vector<int> pushV,vector<int> popV) {
            int size1=pushV.size();
            int size2=popV.size();
            bool flag=false;
            if(size1==0){
                return true;
            }
            int posv=0,popv=0;
            stack<int> tmp;
            while(popv<size2){
                while((tmp.empty() || tmp.top() != popV[popv]) && posv<size1){//当为空时需要填补。入栈队列
                    if(posv==size1){
                        break;
                    }
                    tmp.push(pushV[posv++]);
                }
                if(tmp.top()!=popV[popv]){ //检测当前出栈元素是否位于栈顶
                    break;
                }else{
                    tmp.pop();
                    popv++;
                }
            }
            if(tmp.empty()){
                flag=true;
            }
            return flag;
        }
    };
  • 相关阅读:
    JavaScript 相关记录
    首页大图淡入淡出效果工具flexslider
    取消chrome浏览器下input和textarea的默认样式;html5默认input内容清除“×”按钮去除办法
    Hibernate入门笔记
    Servlet入门笔记
    父容器利用opacity设置透明后,子元素跟着变透明的解决方案
    overflow:hidden与margin:0 auto之间的冲突
    初识Android Studio
    首页图片滚动效果
    DIV宽度设置成100%,浏览器窗口缩小后,右边出现留白
  • 原文地址:https://www.cnblogs.com/fancy-li/p/11625104.html
Copyright © 2011-2022 走看看