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

来源:互联网 发布:什么刻录软件最好用 编辑:程序博客网 时间:2024/06/08 04:28

一:题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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;    }};

阅读全文
0 0
原创粉丝点击