码迷,mamicode.com
首页 > 其他好文 > 详细

栈的压入、弹出序列

时间:2018-12-27 18:33:01      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:数字   bsp   cto   template   vector   clu   不可用   const   pac   

题目

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

思路

  1. 如果下一个弹出的数字不在栈顶,则可能要弹出的数字还没入栈,接着把压入序列中的数字接着入栈,直到下一个需弹出的数字在栈顶
  2. 如果下一个弹出的数字是栈顶数字,那么直接弹出
  3. 如果把压入序列中的所有数字都入栈还没找到要弹出的数字,那么该序列不可能是一个弹出序列

技术分享图片技术分享图片技术分享图片

#include <iostream>
#include <vector>
#include <stack> 
using namespace std;

template <typename T>
class Solution
{
    public:
        bool is_pop_oreder(const vector<T> &v1,const vector<T> &v2);
    private:
        stack<T> s;
};
template <typename T>
bool Solution<T>::is_pop_oreder(const vector<T> &v1,const vector<T> &v2)
{
    typename vector<T>::const_iterator begin_1=v1.begin();//压入序列 
    typename vector<T>::const_iterator begin_2=v2.begin();//弹出序列 
    
    if(v1.empty()||v2.empty()||v1.size()!=v2.size())
        return false;
    //根据压入序列匹配弹出序列,不可用begin_1<v1.end()因为此时栈顶元素不是要弹出的元素,需要一直入栈,入栈完成
    //之后可根据栈中的元素去匹配要弹出的元素 
    while(begin_2<v2.end())
    {
        while(s.empty()||s.top()!=*begin_2)
        {
            if(begin_1==v1.end())//压入序列全部压人之后,不再入栈 
                break;
            
            s.push(*begin_1);
            ++begin_1;
        }
        
        if(s.top()!=*begin_2)
            break;
            
        s.pop();
        ++begin_2;
    }
    if(s.empty()&&begin_2==v2.end())
        return true;
    else
        return false;
}
int main()
{
    vector<int> v1{1,2,3,4,5};
    vector<int> v2{4,3,5,1,2};
    
    Solution<int> s;
    cout<<boolalpha<<s.is_pop_oreder(v1,v2)<<endl;
    return 0;
}

 

栈的压入、弹出序列

标签:数字   bsp   cto   template   vector   clu   不可用   const   pac   

原文地址:https://www.cnblogs.com/tianzeng/p/10185328.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!