您的位置:首页 > 职场人生

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

2017-07-01 16:22 218 查看


题目描述

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

class Solution {

public:

    bool IsPopOrder(vector<int> pushV,vector<int> popV) {

       //添加代码

         

    }

};

分析:假设 pushV={1,2,3,4,5},popV={4,5,3,2,1}。

       首先由pushV.size()可以得到元素个数length,
 
     创建一个辅助栈stackData,将pushV首元素压入到辅助栈中,然后判断与popV中的第一个元素是否相等,若不等,继续将pushV中的元素压入到辅助栈中,每次压入后判断是否与popV中的第一个元素是否相等,直到相等为止。然后将stackData中栈顶元素弹出,继续比较stackData中剩余元素是否与popV中的第二个元素相等,若不等,继续将pushV中的元素压入到辅助栈中,每次还是判断是否与popV中的第二个元素相等,若相等,弹出stackData中栈顶元素。。。依次执行下去,最后若stackData为空,说明popV可以是pushV的一个弹出序列。
 
     示例:
 
     1)依次将pushV中元素1、2、3压入到辅助栈stackData中,直到找到弹出序列popV中的第一个元素4。
 
       stackData: 1      stackData:
2     ....     stackData:
4   
 
                                                        1                                   3
 
                                                                                             2
 
 
    
                                                                                      1
 
     2)将辅助栈stackData栈顶元素4弹出,此时的栈顶元素3与popV中第二个元素5不相等,继续将pushV中元素5压入到辅助栈stackData中,此时栈顶元素5与popV中第二个元素5相等,如下:

 
                                                                        stackData: 5   
 
                                                                                             3
 
                                                                                             2
 
                                        
                                                    1
      3)将辅助栈stackData栈顶元素5弹出,此时的栈顶元素3与popV中第三个元素3相等,弹出stackData栈顶元素3,此时栈顶元素为2,与popV中第四个元素2相等,弹出tackData栈顶元素2,此时此时栈顶元素为1,与popV中第五个元素1相等,弹出。
 
    4)此时的stackData为空栈,则说明存在一种入栈和出栈操作使得popV为pushV的弹出序列。
 代码如下:
class
Solution {

public:

    bool IsPopOrder(vector<int> pushV,vector<int> popV) {    
       int length=pushV.size( );
 
     bool possible=false;
 
     if(!pushV.empty( )&&!popV.empty( )&&length>0)
       {
 
            stack<int> stackData;
 
            int pop_index=0;
 
            for(int i=0;i<length;i++)
 
               {
                        stackData.push(pushV[i]);
                        while( !stackData.empty()&&stackData.top()==popV[pop_index])
//一定注意要判断stackData.empty()
                            {
                                   stackData.pop(
);
                                   pop_index++;
                            }
                         if(stackData.empty())
                             {
                                     possible=true;
                                     return possible;    
                             }
 
               }
 
             return possible;    

 
     }
    }

};

         
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: