22.栈的压入、弹出序列
2017-05-19 20:03
183 查看
给一个栈的压入顺序,判断一个序列是否是这个栈的一个弹出序列。
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路:
设栈的压入顺序 pushV:1,2,3,4,5
给一个正确的弹出序列 popV:4,5,3,2,1
借用一个辅助“栈”:stack,来存放临时的元素
int i=0,j=0;
(1)首先,1压入栈,即stack{1},此时popV[0]=4≠1,所以1暂时不弹出;i++,即i=1
(2)然后,2压入栈,即stack{1,2},此时popV[0]=4≠2,所以2也不弹出;i++,即i=2
(3)然后,3压入栈,即stack{1,2,3},此时popV[0]=4≠3,所以3也不弹出;i++,即i=3
(4)然后,4压入栈,即stack{1,2,3,4},此时popV[0]=4,说明4刚压入就弹出了,是第一个弹出的元素;删除stack最后一个元素,即stack{1,2,3};且j++,即j=1;
(5)继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。
代码实现如下:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路:
设栈的压入顺序 pushV:1,2,3,4,5
给一个正确的弹出序列 popV:4,5,3,2,1
借用一个辅助“栈”:stack,来存放临时的元素
int i=0,j=0;
(1)首先,1压入栈,即stack{1},此时popV[0]=4≠1,所以1暂时不弹出;i++,即i=1
(2)然后,2压入栈,即stack{1,2},此时popV[0]=4≠2,所以2也不弹出;i++,即i=2
(3)然后,3压入栈,即stack{1,2,3},此时popV[0]=4≠3,所以3也不弹出;i++,即i=3
(4)然后,4压入栈,即stack{1,2,3,4},此时popV[0]=4,说明4刚压入就弹出了,是第一个弹出的元素;删除stack最后一个元素,即stack{1,2,3};且j++,即j=1;
(5)继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。
代码实现如下:
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++]); while(j<popV.size() && stack.back()==popV[j]){ stack.pop_back(); j++; } } return stack.empty(); }
相关文章推荐
- 剑指offer-面试题22.栈的压入,弹出序列
- 22.栈的压入和弹出序列
- 剑指offer-面试题22.栈的压入,弹出序列
- 栈的压入、弹出序列
- 剑指offer22 栈的压入、弹出序列
- 剑指offer——面试题22:栈的压入、弹出序列
- 栈的压入、弹出序列
- 《剑指offer》栈的压入、弹出序列
- 栈的压入、弹出序列
- 《剑指offer》面试题22:栈的压入、弹出序列
- 剑指Offer 栈的压入、弹出序列
- 栈的压入、弹出序列
- 剑指offer(12)-栈的压入弹出序列
- 《剑指offer》栈的压入、弹出序列
- 判断栈的压入,弹出序列是否匹配
- 栈的压入弹出序列
- 栈的压入,弹出序列
- 栈的压入、弹出序列
- 面试题22:栈的压入、弹出序列
- (牛客网)栈的压入、弹出序列