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

剑指offer(21):栈的压入、弹出序列

时间:2019-07-26 21:32:01      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:class   int   剑指offer   包含   for   orm   大小   color   整数   

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

 

思路:对于出栈的每一个元素,在它前面入栈的元素,要么已经被弹出(在出栈序列中位于该元素前方),要么未被弹出且之后会被弹出(在出栈序列中位于该元素后方)。4,5,3,2,1 满足但是4,3,5,1,2不满足的区别是,前一个弹出序列,3出现的时候,2和1都未曾出现,那2和1一定会按照     2 -> 1    的顺序(入栈的反向顺序)出现; 而第二个序列中1出现在了2的前面,所以不可能是弹出序列。

考虑每一个出栈元素(比如3),在入栈序列中的位置,以及入栈序列中在它之前的元素/在出栈序列中出现的顺序。 入栈序列中在它之前的元素,要么出栈在它之前,要么在它之后(比如出栈序列2,3,1,4,5, 2在3前面但1在3后边),在它之后出现的/所有入栈序列前端元素/一定满足的条件是/元素在入栈序列位置越靠前,在出栈序列中位置会越靠后(反向)。

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.empty()) return true;
        if(pushV.size() != popV.size()) return false;
        
        typedef vector<int>::iterator iterator;
        for(iterator val_in_pop = popV.begin(); val_in_pop != popV.end(); val_in_pop++){
            iterator current_object = val_in_pop;
            
       // 对每个出栈序列的元素,在入栈序列中找到其位置 iterator val_in_push
= find(pushV.begin(), pushV.end(), *val_in_pop);
       // 如果两个vector不包含同一个元素,那不可能是同一组数
if(val_in_push == pushV.end()) return false;
// 入栈序列之前有多少元素,在弹出序列中的位置大小就要比较多少次, 比如 4,5,3,2,1,对4来说, 入栈序列前面有1,2,3,就要比较三次
for(int i = val_in_push - pushV.begin(); i > 0; i--){
          // 每次前移一个元素,相邻两个元素比较 iterator former_in_push
= val_in_push - 1;
          // 入栈序列前一个元素在出栈序列的位置 iterator former_in_pop
= find(val_in_pop, popV.end(), *former_in_push);
          // 找不到就过,因为可能之前已经弹出去了;找到了就要满足反向的顺序;不满足位置关系就是错误的
if(former_in_pop != popV.end()){ if(former_in_pop - current_object > 0) current_object = former_in_pop; else return false; } val_in_push--; } } return true; } };

 

剑指offer(21):栈的压入、弹出序列

标签:class   int   剑指offer   包含   for   orm   大小   color   整数   

原文地址:https://www.cnblogs.com/heifengli/p/11252848.html

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