剑指offer(21)—栈的压入、弹出序列

来源:互联网 发布:淘宝网浅秋女羊毛衫 编辑:程序博客网 时间:2024/05/21 11:11

栈的压入、弹出序列

题目描述

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

思路

以入栈序列的顺序压入元素,以出栈序列的顺序弹出元素,由于没有重复元素,因此,当遇到冲突时,即返回false,冲突的判断:若下一个弹出的元素刚好是栈顶元素,则直接弹出,否则,继续压入入栈序列中的元素,直到将下一个需要弹出的元素压入栈顶为止,而如果所有元素都入栈,还没有找到下一个弹出的元素,则冲突

代码

class Solution {public:    bool IsPopOrder(vector<int> pushV,vector<int> popV) {        //若长度不等,则返回false        int n_push = pushV.size();        int n_pop = popV.size();        if(n_push != n_pop)            return false;        bool res = false;        stack<int> st;        int next_push = 0, next_pop = 0;        while(next_pop < n_pop){    //还有元素未出栈            while(st.empty() || popV[next_pop] != st.top()){                //栈为空,或者栈顶元素不等于待弹出的元素时,若还有未入栈的元素则将待压入元素入栈                if(next_push >= n_push)                    break;                st.push(pushV[next_push]);                next_push++;            }            if(popV[next_pop] != st.top())                break;            st.pop();            next_pop++;        }        //若st为空,且出栈序列中没有元素未出栈,则一致,返回true;        if(st.empty() && next_pop == n_pop)            return true;        return false;    }};
原创粉丝点击