【面试题】剑指offer22-判断一个序列是否是某一个栈的序列
2017-06-30 16:40
253 查看
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。
假设压入站的所有数字均不相等。
例如序列1,2,3,4,5是某站的压栈序列,序列4,5,3,2,1是该压栈序对应的一个弹出序列,但是4,3,5,2,1
就不是该压栈序列的弹出序列。
解决这个问题,我们需要一个辅助栈,把输入第一个序列的数字依次压入该辅助栈,并按照第二个序列
的顺序依次从该栈中弹出数字。
代码的实现:
假设压入站的所有数字均不相等。
例如序列1,2,3,4,5是某站的压栈序列,序列4,5,3,2,1是该压栈序对应的一个弹出序列,但是4,3,5,2,1
就不是该压栈序列的弹出序列。
解决这个问题,我们需要一个辅助栈,把输入第一个序列的数字依次压入该辅助栈,并按照第二个序列
的顺序依次从该栈中弹出数字。
代码的实现:
#include<iostream> using namespace std; #include<assert.h> #include<stack> bool IsPopOrder(const int* pPush, const int* pPop, size_t length) { assert(length); assert(pPush && pPop); bool possible = false; const int* NextPush = pPush; const int* NextPop = pPop; stack<int> s; while (NextPop - pPop < length) { while (s.empty() || s.top() != *NextPop) { if (NextPush - pPop == length) { break; } s.push(*NextPush); NextPush++; } if (s.top() != *NextPop) { break; } s.pop(); NextPop++; } if (s.empty() && NextPop - pPop == length) { possible = true; } return possible; }
相关文章推荐
- 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)
- 堆栈面试题之共享栈,最小栈,判断一个序列是否由一个栈进行基本的入出栈操作而得到
- 【面试题】剑指offer24--判断一个序列是否为二叉树的后序遍历
- 经典面试题:求数组的最大子序列和;实现函数 :判断一个自负喜欢是否是另一个字符串旋转所得;杨氏矩阵中查找一个数。
- 面试题精选(76):给定BST先序遍历序列,不构造BST的情况下判断BST是否每个node都只有一个child
- 【面试题】判断一个序列是不是栈的输出序列
- 关于序列的面试题1 ------------- 判断整数序列是否是二叉排序树的后续遍历
- 给定一个数组,判断这个数组的元素是否是在一个序列
- Havel-Hakimi定理(判断一个序列是否可图)
- Havel-Hakimi定理(判断一个序列是否可图)
- Havel-Hakimi定理(判断一个度数序列是否可图)
- 面试题:判断一个整数是否为偶数,要求使用至少3种方法
- 给定BST先序遍历序列,不构造BST的情况下判断BST是否每个node都只有一个child
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- Havel-Hakimi定理(判断一个序列是否可图)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 判断一个序列是否为栈的输出序列
- 判断一个序列的出栈次序是否合法