【剑指Offer】面试题22:栈的压入,弹出序列

一:题目描述

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


二:解题思路

解决这个问题,就根据题目模拟栈的入栈和出栈的过程

如入栈顺序1,2,3,4,5   出栈的顺序4,5,3,2,1


借助一个辅助栈,模拟入栈和出栈的过程

1,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,不同

2,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,不同

3,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,不同

4,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同

                              4出栈,出栈顺序当前元素为5,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,不同

5,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同

                              5出栈,出栈顺序当前元素为3,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同

                              3出栈,出栈顺序当前元素为2,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同

                              2出栈,出栈顺序当前元素为1,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同

                              1出栈,出栈顺序当前元素为X,栈空

栈空同时与出栈顺序全部比较完成,返回true


综上:解决该问题需要一个辅助栈,按照第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从栈中弹出数字

                              


三:代码实现

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        
        if(pushV.size()==0 && popV.size()==0)
            return true;
        if(pushV.size()!=popV.size())
            return false;
        
        stack<int> data;
        
        int i;//pushV
        int j=0;//popV
        
        //按照压栈顺序,依次将元素压入栈中
        for(i=0;i<pushV.size();i++){
            
            data.push(pushV[i]);
            
            //如果栈顶元素与出栈序列元素相同,则出栈
            while(!data.empty() && j<popV.size() && data.top()==popV[j]){
                j++;
                data.pop();
            }
        }
        
        if(data.empty() && j==popV.size())
            return true;
        else
            return false;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章