剑指offer 22:验证栈的压入弹出序列

Posted fancy-li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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;
    
;

 

 

以上是关于剑指offer 22:验证栈的压入弹出序列的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer:面试题22栈的压入弹出序列

[剑指offer]面试题22:栈的压入弹出序列

剑指offer二十一之栈的压入弹出序列

剑指Offer:栈的压入弹出序列31

c++刷题——剑指offer21.栈的压入弹出序列

栈的压入弹出序列-剑指Offer