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

 

 

posted @ 2019-10-05 16:57  fancy_li  阅读(156)  评论(0编辑  收藏  举报