IMWeb提升营Day4 | 训练题21:栈的压入、弹出序列

来源:互联网 发布:淘宝升钻有什么好处 编辑:程序博客网 时间:2024/06/04 20:37

题目描述

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

思路一:找规律区分

/* * 思路:出栈序列的第一个数字A可以把入栈序列分为两个部分,一部分是比A早入栈的,一部分是比A晚入栈的 * 比A早入栈的必须倒序在出栈序列中,比A晚入栈的可以递归查 */class Solution {public:    bool IsPopOrder(vector<int> pushV,vector<int> popV) {        if(pushV.size() != popV.size()) return false;        if(pushV.size() == 0) return true;        if(pushV.size() == 1 && (pushV[0] == popV[0])) return true;        if(pushV.size() == 1 && (pushV[0] != popV[0])) return false;        vector<int> pushVpre;        vector<int> pushVback;        vector<int> popVpre;        vector<int> popVback;        int firstnum = popV[0];        int preflag = 0;        //把入栈序列划分成两部分        for(vector<int>::iterator itt = pushV.begin(); itt != pushV.end(); itt++){            if(*itt == firstnum){                preflag = 1;            }else{                if(preflag == 0){                    pushVpre.push_back(*itt);                }else{                    pushVback.push_back(*itt);                }            }        }        //根据先入栈的必须倒叙出栈,把出栈序列中先入栈的元素删除,剩下的就是晚入栈的,注意出栈序列的第一个不算        vector<int>::iterator itt = popV.end();        itt--;        for(; itt != popV.begin(); itt--){            if(*itt == pushVpre[0]){                popVpre.insert(popVpre.begin(),*itt);                pushVpre.erase(pushVpre.begin());            }else{                popVback.insert(popVback.begin(),*itt);            }        }        //把出栈元素也分成两部分后,后入栈和后出栈的元素数量不一致的话,说明顺序不对        if(pushVback.size() != popVback.size()){            return false;        }        //能进行到这一步,说明先入栈和先出栈的顺序没错,只需要递归对比后入栈和后出栈的顺序对不对就行了        return IsPopOrder(pushVback, popVback);    }};

思路二:简洁高效的走一遍出栈入栈流程

/* * 思路二:用一个辅助栈 ,把入栈出栈流程走一遍,最后辅助栈为空说明顺序是对的 * 举例:   入栈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   ….   依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。 */class Solution {public:    bool IsPopOrder(vector<int> pushV,vector<int> popV) {        if(pushV.size() == 0 || popV.size() == 0) return false;        vector<int> stackV;        for(int i = 0, j = 0; i < pushV.size(); i++){            stackV.push_back(pushV[i]);            while(j < popV.size() && stackV.back() == popV[j]){                stackV.pop_back();                j++;            }        }        if(stackV.empty()) return true;        else return false;    }};