29、栈的压入、弹出序列

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


解题思路:


入栈的顺序如第一个序列。


栈的弹出顺序有多种。


让弹出栈的元素和第二个序列的元素匹配,若不匹配可以一直压入辅助栈,直到遇到相同的;


若最后辅助栈内依然有值没有出栈,说明了第二个序列中依然有元素没有匹配完。也就是说第二个序列不可能为该栈的弹出序列。



class Solution {

public:

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

   {

       if(pushV.size() == 0) return false;//压入序列

       vector<int> stack;//定义一个辅助栈

       for(int i = 0,j = 0 ;i < pushV.size();)

       {

           stack.push_back(pushV[i++]);//栈的末尾添加元素  i累加之前

           //将原序列压入辅助栈 压入的个数取决于弹出序列==辅助栈的末尾元素

           while(j < popV.size() && stack.back() == popV[j])

           {

               stack.pop_back();//辅助栈出栈

               j++;

           }      

       }

       return stack.empty();//若辅助栈为空,说明第二个序列为该栈的弹出序列

   }

};

目录
相关文章
最小栈 与 栈的压入、弹出序列
最小栈 与 栈的压入、弹出序列
47 0
最小栈 与 栈的压入、弹出序列
|
4月前
|
算法
【算法】栈算法——栈的压入、弹出序列
【算法】栈算法——栈的压入、弹出序列
|
4月前
|
算法 C语言 C++
【practise】栈的压入和弹出序列
【practise】栈的压入和弹出序列
【剑指offer】-栈的压入、弹出序列-20/67
【剑指offer】-栈的压入、弹出序列-20/67
|
7月前
牛客网-栈的压入、弹出序列
牛客网-栈的压入、弹出序列
36 0
|
存储
【Leetcode】155. 最小栈、JZ31 栈的压入、弹出序列
155. 最小栈 155. 最小栈 题目描述; 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
43 0
剑指offer 30. 栈的压入、弹出序列
剑指offer 30. 栈的压入、弹出序列
54 0
剑指offer_栈和队列---栈的压入,弹出序列
剑指offer_栈和队列---栈的压入,弹出序列
53 0